我试图在将 mysqldump 通过管道传输到另一个 SQL 数据库之前删除其约束。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
可以了。