延後唯一/主鍵約束:研究延後時間
在PostgreSQL 中,唯一和主鍵約束可以定義為可延後或延後可定義延期。推遲約束檢查提供了更大的靈活性,允許在強制執行約束之前進行資料修改。
強制執行時間
當約束被標記為可延遲時,其強制執行時間取決於其初始設定(立即或延遲)以及使用SET CONSTRAINTS 的任何後續更改。摘要如下:
範例分析
讓我們檢查給定的查詢:
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中文網其他相關文章!