我的数据库中有三个表:tbl_object
、tbl_tag
adn tbl_object_tag_xref
。
tbl_object
并且tbl_tag
只有两列id
和name
。
tbl_object_tag_xref
将对象与标签匹配,反之亦然,具有列id
、tbl_object_id
和tbl_tag_id
。
和tbl_object
表tbl_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 WARNINGS
和SHOW ERRORS
不起作用,因为失败的语句通常不是最后一个。SHOW INNODB STATUS
很麻烦,只显示最后一个外键错误,没有摘要。由于数据可能很大(3000 多行),滚动不是选项,输出缓冲区通常太小,无法保存所有输出。
有什么建议么?
答案1
在您的 .cfg/.ini 中将 performance_schema = ON
运行您的流程,然后使用 performance_schema; SELECT * FROM statements_with_errors_or_warnings\G; 将列出所有最近的错误或警告。将首先列出错误,然后列出警告。