2010-09-27 2 views
2

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

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

ERROR 1062 (23000) at line 3086: Duplicate entry '56.450000000--3.366670000-121' for key 'lat_lon_height'

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

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; 

Что я делаю неправильно?

ответ

1

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

+0

, который действительно работает, спасибо за этот намек! :-) взял меня немного, чтобы найти что-то на самом деле в хранимой процедуре, не просто хотел поместить все 78000 вставных инструкций там ... в связи с синтаксической ошибкой, я могу только опасаться дикой догадки У меня что-то есть с разделителем не так, и в первый раз я делаю это. – ssc

0

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

mysql --force < my_insertion_script.sql 

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

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

+0

Нет, я _must_ получаю обработчик продолжения, потому что существуют различные проблемы с устаревшими данными, и мне нужен обработчик для вывода дополнительной диагностической информации для дальнейшего анализа. – ssc