如何调试包含带有失败子查询的 INSERT 语句的 SQL 脚本?

如何调试包含带有失败子查询的 INSERT 语句的 SQL 脚本?

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

tbl_object并且tbl_tag只有两列idname

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

tbl_objecttbl_tag已填充相应数据。只有tbl_object_tag_xref表仍为空。

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

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

由于脚本可能无法解析并产生一些错误的行,因此该输出需要人工验证和更正(这里的实际数据要复杂得多,无法自动化)。

修正后的数据转换为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'))
...

现在我想通过获取这些语句将这些数据导入数据库。当然,这些语句中存在错误的可能性。调试这些错误的最佳方法是什么?是否有工具可以帮助我?我是否应该重新考虑整个工作流程?

对我来说,最佳的调试工作流程如下所示(伪代码):

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 多行),滚动不是选项,输出缓冲区通常太小,无法保存所有输出。

有什么建议么?

答案1

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

相关内容