4

この行をテーブルから削除していますが、FKに多数のカスケードがあり、最終的に次のエラーが発生します。

エラー:テーブル「foo_route」の挿入または更新が外部キー制約「foo_route_bar_fk」に違反しています

SQL状態:23503

詳細:キー(bar_key)=(2176)がテーブル"bar"に存在しません。

foo_route_bar_fkは次のように定義されます。

ALTER TABLE foo_route  
ADD CONSTRAINT foo_route_bar_fk FOREIGN KEY (bar_key) REFERENCES bar (bar_key) 
MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE;

これらの両方に関係のないテーブルを削除すると、このエラーが発生します。何が起こっているのかはトリガーかカスケードがこのエラーを引き起こしていると思いますが、その理由を見つけるのは難しいです。

私の質問は、postgresqlでこのような問題をどのようにデバッグするのですか? このエラーの原因となった一連の手順は何ですか? Postgresqlは、失敗する前に最後に行った結果のみを通知します。これがコードの場合、エラーは非常に役立つスタックトレースを提供します。Postgresqlでそのようなものを見る方法はありますか?

4

1 に答える 1

2

通常、postgresqlログには、エラーをトリガーしたステートメントが含まれます。これにより、カスケードイベントのチェーンをたどることができます。

ただし、私が提案することの1つは、fkeyのマップを作成し、外部キーのONイベントのマッピングを確認することをお勧めします。私の場合は、スキーマのみのダンプまたはpg_autodoc出力から始めて、そこから進みます。明らかな問題は、削除ができない場合にカスケードを削除しているため、ここで確認して再考する必要があることです。

于 2013-01-27T07:38:10.190 に答える