2017-02-27 43 views
0

我學習Sequelize和模型的外鍵,但我不明白有什麼目的deferable field在Sequelize外鍵中可推遲什麼?

這將創建一個外鍵,將檢查約束

我不明白這裏有什麼限制(限制)。我應該定義它嗎?我已經在官方文檔中查看過這些代碼,但它沒有幫助,也無法理解它的用法。如果有人能幫助我理解,會很感激。

回答

2

的文檔提到:

到延遲約束相關屬性的集合。可以使用 使外鍵約束延遲並在事務中設置 約束。 這僅在PostgreSQL的 中支持。

所以,這是您的提示谷歌postgres foreign key deferrable或類似。 postgres docs say

SET CONSTRAINTS在 當前事務中設置約束檢查行爲。 IMMEDIATE約束在 每條語句的最後檢查。在事務 提交之前,DEFERRED約束不會被檢查。每個約束都有其自己的IMMEDIATE或DEFERRED模式。

創建後,約束被賦予以下三個特徵之一: 可初始化初始化,初始化初始化,或不爲 DEFERRABLE。第三類始終是IMMEDIATE,不受SET CONSTRAINTS命令的 影響。前兩個類別以指定模式開始每個 交易,但其行爲可以通過SET CONSTRAINTS在交易中更改爲 。

拆包:推遲意味着您可以「推遲」檢查外鍵約束直到事務結束。 (順便說一下,交易基本上都是「查詢組」,要麼全部成功,要麼其中一個失敗,其他所有其他客戶也都回滾。)

讓我們來看一個人爲的例子:假設您有一個blogs表中有一個指向categories表的外鍵。當您插入新的博文時,它鏈接的分類必須存在 - 否則blogs to categories外鍵約束將失敗。但是...如果我們使用的遞延功能,那麼我們可以做這樣的事情(在僞代碼):

1. Being a transaction 
2. Tell postgres to use deferred foreign key constraints for this transaction 
3. Insert a blog that links to the "Hello World" category (which does not yet exist) 
3a. (Note this is where Postgres would normally check the foreign key constraint and fail) 
4. Insert the "Hello World" Category 
5. Commit the transaction 
6. Because we're using the DEFERRED feature, the foreign key check 
    will happen now, at the end of the transaction, instead of at 3a, 
    and it will succeed, because "Hello Wolrd" category now exists! 

爲了削減長話短說,你應該離開了deferrable鍵(或設置到false),除非你知道你需要它。