如何debugging含有失败子查询的INSERT语句的SQL脚本?

我在我的数据库中有三个表: tbl_objecttbl_tag tbl_object_tag_xref

tbl_objecttbl_tag只有两列idname

tbl_object_tag_xref将对象与标签进行匹配,反之亦然,具有列idtbl_object_idtbl_tag_id

tbl_objecttbl_tag表已经被填充了适当的数据。 只有tbl_object_tag_xref表仍然是空的。

我有一个脚本parsing各种数据源,并以CSV格式输出这些外部参照:

 "object1","tag1" "object1","tag2" "object2","tag2" ... 

由于脚本可能无法parsing,并产生一些错误的行,这个输出然后由人手validation和纠正(这里的真实数据要复杂得多,而且不能自动执行)。

更正后,数据转换为SQL查询:

 INSERT INTO tbl_object_tag_xref VALUES (NULL, (SELECT id FROM tbl_object WHERE name = 'object1'), (SELECT id FROM tbl_tag WHERE name = 'tag1')) INSERT INTO tbl_object_tag_xref VALUES (NULL, (SELECT id FROM tbl_object WHERE name = 'object1'), (SELECT id FROM tbl_tag WHERE name = 'tag2')) INSERT INTO tbl_object_tag_xref VALUES (NULL, (SELECT id FROM tbl_object WHERE name = 'object2'), (SELECT id FROM tbl_tag WHERE name = 'tag2')) ... 

现在我想通过采购这些语句将这些数据导入到数据库中。 当然这些陈述中存在错误的内在可能性。 debugging这些错误的最好方法是什么? 有工具可以帮助我吗? 我应该重新考虑整个工作stream程吗?

我的最佳debugging工作stream程如下所示(伪代码):

 BEGIN; SOURCE insert_statements.sql; SUMMARIZE all warnings and errors; including information whether already a subquery failed, which one and why including information about the respective line numbers and content in the .sql and the .csv files ASK whether to COMMIT or ROLLBACK; 

但是, SHOW WARNINGSSHOW ERRORS不起作用,因为失败的声明通常不是最后一个。 SHOW INNODB STATUS是一个痛苦的屁股,只显示最后的外键错误,没有总结。 由于数据可能很大(超过3000行),滚动是不可选的,输出缓冲区通常很小以保存所有的输出。

有什么build议么?

performance.cchema = ON在您的.cfg / .ini
运行你的过程,然后使用performance_schema; SELECT * FROM statements_with_errors_or_warnings \ G; 将列出所有最近的错误或警告。 错误将首先列出,然后警告。