Я пытаюсь удалить ограничения из mysqldump перед его передачей в другую базу данных SQL. Mysqldump генерирует таблицы, которые выглядят примерно так с 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 или что-то подобное; я хочу иметь возможность делать это как часть конвейера.
Вероятно, после этого я мог бы запустить SQL, использующий INFORMATION_SCHEMA для удаления ограничений, но мне интересно, есть ли более элегантный способ сделать это, используя только средства обработки текста?
Нет причин, по которым вы не можете использовать Perl в конвейере. Если предположить, что \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
делает свое дело.