mysqldumpを別のSQLデータベースに接続する前に、mysqldumpの制約を削除しようとしています。MySQLダンプ結果表には、1つ以上の制約が含まれている次のものがあります。
CREATE TABLE `SOME_TBL` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'blah',
/* ... */
PRIMARY KEY (`ID`) USING BTREE,
CONSTRAINT `SOME_TBL_FC1` FOREIGN KEY (`SOME_FIELD`) REFERENCES `SOME_OTHER_TBL` (`ID`),
CONSTRAINT `SOME_TBL_FC2` FOREIGN KEY (`ANOTHER_FIELD`) REFERENCES `ANOTHER_TBL` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3845453 DEFAULT CHARSET=utf8 COMMENT='data lives here';
次のように制約線を削除できます。
mysqldump --source-database \
| sed -E '/^ *CONSTRAINT/d' \
| mysql --result-database
しかし、次のように末尾のカンマを残しました。
CREATE TABLE `SOME_TBL` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'blah',
/* ... */
PRIMARY KEY (`ID`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=3845453 DEFAULT CHARSET=utf8 COMMENT='data lives here';
...SQLが好きではありません。 (上記の「BTREE」の後のコンマに注意してください)。注削除したくありません。みんな,\n)
末尾のカンマ、改行、および閉じ括弧の前に表示されるカンマのみが該当します。
これらの末尾のコンマと中間制約線を削除する最も簡単な方法は何ですか?ダンプのサイズはおそらく数ギガバイトなので、単にファイル全体をPerlなどに入れることはできず、パイプラインの一部として使用できるようにしたいです。
後でINFORMATION_SCHEMAを使用して制約を削除するいくつかのSQLを実行することもできますが、テキスト処理ツールのみを使用してこれを実行するよりエレガントな方法があるかどうか疑問に思います。
答え1
使用できない理由はありません真珠パイプラインから。 \r(DOSではない)行末を想定してプログラム例:
#!/usr/bin/perl
unless( defined $previous && length $previous ){
$previous = `$_`;
redo LINE;
}
if( m/CONSTRAINT/ ){
$previous =~ s/\,\s*\n$/ \n/;
next LINE;
}
print $previous;
$previous = `$_`;
END{
print $previous;
}
だとしたらcat dump.sql | perl -n program.pm | and so on
大丈夫です。