2017-10-31 8 views
0

他のデータによって参照されるデータを更新しようとしています。ms_automobileテーブルを切り捨ててリロードしますが、rm_automobileテーブルには外部キーがあります。テーブル上のトリガーを無効にした後に外部キーがアクティブになるのはなぜですか?

'DISABLE TRIGGER' 文は(postgresの、スーパーユーザーとして実行する)作業しているように見えます:

mobilesurvey=# ALTER TABLE ms_automobile DISABLE TRIGGER ALL; 
ALTER TABLE 
mobilesurvey=# ALTER TABLE rm_automobile DISABLE TRIGGER ALL; 
ALTER TABLE 

しかし、私は、その後ms_automobileテーブルを切り捨てることはできません。

mobilesurvey=# TRUNCATE TABLE ms_automobile; 
ERROR: cannot truncate a table referenced in a foreign key constraint 
DETAIL: Table "rm_automobile" references "ms_automobile". 
HINT: Truncate table "rm_automobile" at the same time, or use TRUNCATE ... CASCADE. 

アゲイン、私はrm_automobileデータを失いたくはありません。 TRUNCATEの後に、欠落しているms_automobileデータを含むpg_restoreを実行する予定です。

可能であれば、私は制約を破棄するのではなく、無効にしたいと思っています。もっと多くのものがあり、disable/enableを維持することはdrop/addを維持するよりも誤りが起こりにくいようです。

ここで、実際に外部キーを無効にするにはどうすればよいですか。

答えて

0

トリガーを無効にすることは、DELETEで期待どおりに機能します(TRUNCATEでは機能しません)。

DELETE FROM ms_automobile; 

TRUNCATEは、INSERT/UPDATE/DELETEとは異なる特定の方法で実装されています。トリガは使用しませんが、実行前に一度参照整合性をチェックします。

関連する問題