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 INTO
MySQLは句内の文字列に一重引用符を使用しますINSERT INTO
SQLiteと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;
}
}