MySQL: DECLARE CONTINUE HANDLER, чтобы продолжить при ошибках, печатая предупреждение - PullRequest
2 голосов
/ 27 сентября 2010

Я проверяю / реорганизую / реорганизую базу данных и хочу создать новую базу данных, которая будет хранить практически те же данные более разумным способом. Одна из проблем в «устаревшей» базе данных заключается в том, что она не использует должным образом ключи и индексы, поэтому есть дублирующиеся записи там, где их не должно быть.

Я написал скрипт на python, который считывает данные из устаревшей базы данных и генерирует скрипт SQL, который, в свою очередь, вставляет эти значения из устаревшей базы данных в новую базу данных, используя множество очень похожих операторов SQL INSERT. Сценарий SQL останавливается каждый раз, когда встречается повторяющаяся запись с сообщением об ошибке

ОШИБКА 1062 (23000) в строке 3086: повторяющаяся запись '56 .450000000--3.366670000-121 'для ключа' lat_lon_height '

какой именно AFAICT это именно то, что он должен делать. Однако на данный момент я просто хочу, чтобы скрипт продолжал работать, не вставляя дублирующиеся записи, а печатая предупреждение о них. Я попытался установить обработчик продолжения в начале сценария несколькими способами, следуя документам MySQL и некоторым другим онлайн-ресурсам , но все они просто создают синтаксическую ошибку:

DECLARE CONTINUE HANDLER FOR 1062 
SELECT 'Duplicate key in unique index';

или

DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'
SELECT 'Duplicate key in unique index';

или

DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'
BEGIN
SELECT 'Duplicate key in unique index';
END;

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

Я не использовал обработчики, кроме как внутри хранимых процедур, где их использование было ограниченным, но без происшествий. Возможно, вы можете превратить ваш код в хранимую процедуру, а затем запустить хранимую процедуру? Возможно, вы обнаружите, что MySQL принимает то, что вы пытаетесь сделать.

0 голосов
/ 27 сентября 2010

ОК, один из способов заставить SQL-скрипт просто распечатать все возникающие ошибки - использовать параметр командной строки --force, как в

mysql --force < my_insertion_script.sql

Все еще не знаю, что на самом деле делать с дублирующимися записями, но как только я понял это (не проблема SQL), это , вероятно, поможет.

Хотелось бы, чтобы обработчик продолжения работал ...

...