天天看點

對PostgreSQL的UPDATE和DELETE外鍵屬性思考

外鍵建立時預設屬性是MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION。這裡需要深入思考一下NO ACTION這部分。

首先,該部分參數有三種:

1)NO ACTION - 不允許删除/更新,但是在事務中延遲報錯。

2)RESTRICT - 不允許删除/更新,直接報錯。

3)CASCADE - 允許級聯删除/更新。

在這裡,CASCADE最好了解,是級聯的意思,如删除父表資料時子表關聯資料也存在則會級聯删除。

NO ACTION和RESTRICT對于操作都會進行檢查,如果不符合限制則會報ERROR并退出,資料不變,唯一的差別是NO ACTION可以設定限制在事務中延遲生效,而RESTRICT不允許。個人了解應該是處于事務性能的考慮,假設在一個大事務中,定義的是RESTRICT,那麼執行每一條語句都回去校驗,如果整個事務中沒有關聯删除的錯誤存在,那必然會導緻時間的浪費;但是如果此時使用NO ACTION,事務整個過程都在平滑處理,到最後送出時,如果存在級聯限制,那麼久報錯退出,如果不存在久直接送出整個事務,此時是最省時的。另外事務具有原子性,針對一個事務做此處理也說的過去。

繼續閱讀