sql >> データベース >  >> RDS >> Mysql

ベストプラクティス:mySQLファイルをPHPにインポートします。分割クエリ

    これは、ファイル全体を一度に開く必要なしに、個々のクエリで大きなファイルを分割できるはずのメモリフレンドリーな関数です。 :

    function SplitSQL($file, $delimiter = ';')
    {
        set_time_limit(0);
    
        if (is_file($file) === true)
        {
            $file = fopen($file, 'r');
    
            if (is_resource($file) === true)
            {
                $query = array();
    
                while (feof($file) === false)
                {
                    $query[] = fgets($file);
    
                    if (preg_match('~' . preg_quote($delimiter, '~') . '\s*$~iS', end($query)) === 1)
                    {
                        $query = trim(implode('', $query));
    
                        if (mysql_query($query) === false)
                        {
                            echo '<h3>ERROR: ' . $query . '</h3>' . "\n";
                        }
    
                        else
                        {
                            echo '<h3>SUCCESS: ' . $query . '</h3>' . "\n";
                        }
    
                        while (ob_get_level() > 0)
                        {
                            ob_end_flush();
                        }
    
                        flush();
                    }
    
                    if (is_string($query) === true)
                    {
                        $query = array();
                    }
                }
    
                return fclose($file);
            }
        }
    
        return false;
    }
    

    大きなphpMyAdminSQLダンプでテストしたところ、問題なく動作しました。

    いくつかのテストデータ:

    CREATE TABLE IF NOT EXISTS "test" (
        "id" INTEGER PRIMARY KEY AUTOINCREMENT,
        "name" TEXT,
        "description" TEXT
    );
    
    BEGIN;
        INSERT INTO "test" ("name", "description")
        VALUES (";;;", "something for you mind; body; soul");
    COMMIT;
    
    UPDATE "test"
        SET "name" = "; "
        WHERE "id" = 1;
    

    そしてそれぞれの出力:

    SUCCESS: CREATE TABLE IF NOT EXISTS "test" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT, "description" TEXT );
    SUCCESS: BEGIN;
    SUCCESS: INSERT INTO "test" ("name", "description") VALUES (";;;", "something for you mind; body; soul");
    SUCCESS: COMMIT;
    SUCCESS: UPDATE "test" SET "name" = "; " WHERE "id" = 1;
    


    1. SQLServerへのUTF-16/Unicodeデータの保存

    2. データを別のテーブルにコピーする

    3. 2つのMySQLデータベースを比較する

    4. NEWSEQUENTIALID()を使用して、SQLServerでインクリメントGUIDを作成します