首頁 > 資料庫 > mysql教程 > 延遲時間如何影響 PostgreSQL 中的唯一/主鍵約束強制執行?

延遲時間如何影響 PostgreSQL 中的唯一/主鍵約束強制執行?

DDD
發布: 2025-01-06 09:37:40
原創
910 人瀏覽過

How Does Deferral Timing Affect Unique/Primary Key Constraint Enforcement in PostgreSQL?

延後唯一/主鍵約束:研究延後時間

在PostgreSQL 中,唯一和主鍵約束可以定義為可延後或延後可定義延期。推遲約束檢查提供了更大的靈活性,允許在強制執行約束之前進行資料修改。

強制執行時間

當約束被標記為可延遲時,其強制執行時間取決於其初始設定(立即或延遲)以及使用SET CONSTRAINTS 的任何後續更改。摘要如下:

  • NOT DEFERRABLE: 每行操作後進行約束檢查。
  • DEFERRABLE with IMMEDIATE: 每條語句後進行約束檢查.
  • 可延遲延遲(或初始延遲): 每次交易後進行交易後進行約束檢查。

範例分析

讓我們檢查給定的查詢:

UPDATE tbl SET id = t_old.id FROM tbl t_old WHERE (t.id, t_old.id) IN ((1,2), (2,1));
登入後複製

此UPDATE 對多行進行操作,可能會違反唯一主鍵約束。但是,它會成功,因為約束被定義為 DEFERABLE INITIALLY IMMEDIATE。根據上述規則,這意味著在語句完成後進行約束檢查,從而允許應用更改。

CTE 行為

資料修改 CTE,如在範例中看到,行為類似。儘管 CTE 中更新的順序是不可預測的,但在整個 CTE 執行後仍會套用約束檢查。

多個 UPDATE 語句

當多個 UPDATE 語句被執行時在單一交易中執行時,約束檢查取決於是否使用 SET CONSTRAINTS。如果沒有 SET CONSTRAINTS,檢查會在每個語句之後進行,這可能會導致唯一的違規,正如預期的那樣。

唯一/主鍵區別

重要的是要注意,唯一主鍵約束在 PostgreSQL 中受到特殊處理。在每個命令後都會檢查不可延遲的唯一/主鍵約束,但 PostgreSQL 建議使用 INITIALLY IMMEDIATE 將它們定義為可延遲的,以實現符合標準的行為。

結論

雖然在某些情況下,延遲唯一/主鍵約束的行為可能與預期不同,但不一定是錯誤。延遲約束檢查為資料修改提供了靈活性,了解其執行時間對於最佳化效能和避免意外錯誤至關重要。

以上是延遲時間如何影響 PostgreSQL 中的唯一/主鍵約束強制執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板