SQLite3 を MySQL に移行する簡単な方法はありますか? [closed] 質問する

SQLite3 を MySQL に移行する簡単な方法はありますか? [closed] 質問する

SQLite3 データベースを MySQL に簡単かつ迅速に移行する方法を知っている人はいますか?

ベストアンサー1

誰もがいくつかの grep と perl 式から始めて、自分の特定のデータセットで機能するものをなんとか手に入れているようですが、データが正しくインポートされたかどうかはわかりません。この 2 つを変換できる堅牢なライブラリを誰も構築していないことに、私は本当に驚いています。

以下に、私が知っている 2 つのファイル形式間の SQL 構文のすべての違いのリストを示します。次の行で始まる行:

  • 取引を開始
  • 専念
  • sqlite_シーケンス
  • 一意のインデックスを作成する

MySQLでは使用されない

  • SQLiteの使用CREATE TABLE/INSERT INTO "table_name"とMySQLの使用CREATE TABLE/INSERT INTO table_name
  • MySQLはスキーマ定義内で引用符を使用しません
  • INSERT INTOMySQLは句内の文字列に一重引用符を使用します
  • INSERT INTOSQLiteとMySQLでは、句内の文字列をエスケープする方法が異なります。
  • SQLite はブール値として't'とを使用し'f'、MySQL は1と を使用します0( 内に「I do, you don't」のような文字列があると、これに対する単純な正規表現は失敗する可能性がありますINSERT INTO)
  • SQLLiteは使用AUTOINCREMENT、MySQLは使用AUTO_INCREMENT

これは、私のデータセットで機能し、Web で見つけた他の Perl スクリプトよりも多くの条件をチェックする、非常に基本的な改造された Perl スクリプトです。Nu は、これがあなたのデータでも機能することを保証しますが、自由に変更してここに投稿してください。

#! /usr/bin/perl

while ($line = <>){
    if (($line !~  /BEGIN TRANSACTION/) && ($line !~ /COMMIT/) && ($line !~ /sqlite_sequence/) && ($line !~ /CREATE UNIQUE INDEX/)){
        
        if ($line =~ /CREATE TABLE \"([a-z_]*)\"(.*)/i){
            $name = $1;
            $sub = $2;
            $sub =~ s/\"//g;
            $line = "DROP TABLE IF EXISTS $name;\nCREATE TABLE IF NOT EXISTS $name$sub\n";
        }
        elsif ($line =~ /INSERT INTO \"([a-z_]*)\"(.*)/i){
            $line = "INSERT INTO $1$2\n";
            $line =~ s/\"/\\\"/g;
            $line =~ s/\"/\'/g;
        }else{
            $line =~ s/\'\'/\\\'/g;
        }
        $line =~ s/([^\\'])\'t\'(.)/$1THIS_IS_TRUE$2/g;
        $line =~ s/THIS_IS_TRUE/1/g;
        $line =~ s/([^\\'])\'f\'(.)/$1THIS_IS_FALSE$2/g;
        $line =~ s/THIS_IS_FALSE/0/g;
        $line =~ s/AUTOINCREMENT/AUTO_INCREMENT/g;
        print $line;
    }
}

おすすめ記事