2

私はデータベースのレビュー/再設計/リファクタリングを行っており、ほぼ同じデータをよりスマートに保存する新しいデータベースを作成したいと考えています。'legacy'データベースの問題の1つは、キーとインデックスが適切に使用されていないため、存在しないはずのエントリが重複していることです。

レガシーデータベースからデータを読み取り、SQLスクリプトを生成するPythonスクリプトを作成しました。このスクリプトは、非常によく似たSQL INSERTステートメントを多数使用して、レガシーデータベースから新しいデータベースにこれらの値を挿入します。SQLスクリプトは、エラーメッセージが表示された重複エントリが検出されるたびに停止します

3086行目のエラー1062(23000):キー「lat_lon_height」のエントリ「56.450000000--3.366670000-121」が重複しています

どの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;

私は何を間違っているのですか?

4

2 に答える 2

1

ハンドラーの使用は制限されていましたが、平穏無事だったストアド プロシージャ内以外では、ハンドラーを使用していません。おそらく、コードをストアド プロシージャにしてから、ストアド プロシージャを実行できますか? そのとき、MySQL があなたがやろうとしていることを受け入れていることに気付くかもしれません。

于 2010-09-27T10:20:39.417 に答える
0

OK、発生したすべてのエラーを単純に SQL スクリプトに出力させる 1 つの方法は、次のように --force コマンド ライン オプションを使用することです。

mysql --force < my_insertion_script.sql

重複したエントリについて実際に何をすべきかはまだわかりませんが、(SQL の問題ではなく) それが分かれば、おそらく役立つでしょう。

ただし、続行ハンドラーを機能させたいと思っています...

于 2010-09-27T08:34:12.793 に答える