У меня в базе данных три таблицы: tbl_object
, tbl_tag
и 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+ строк), прокрутка невозможна, а буфер вывода обычно слишком мал, чтобы сохранить весь вывод.
Какие-либо предложения?
performance_schema = ON в вашем .cfg / .ini
запустите ваш процесс, а затем USE performance_schema; ВЫБЕРИТЕ * ИЗ операторов_с_ ошибками_или_ предупреждения \ G; перечислит все самые последние ошибки или предупреждения. Сначала будут перечислены ошибки, а затем предупреждения.