Sequelize外键可以推迟什么?

时间:2017-02-27 19:46:53

标签: postgresql sequelize.js

我正在学习Sequelize和模型的外键,但我不明白目的是什么deferable field

  

它将创建一个检查约束的外键

我不明白这里有什么限制(限制)。我应该定义它吗?我已经在官方文档上查看了代码,但它没有帮助,也无法理解它的用法。如果有人帮助我理解,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

文档提到:

  

与可延迟约束相关的属性集合。它可以   用于使外键约束可延迟并设置   交易中的约束。 仅支持此功能   的PostgreSQL。

所以,这是你提到谷歌postgres foreign key deferrable或类似的提示。 postgres docs say

  

SET CONSTRAINTS设置约束检查的行为   当前交易。在结束时检查IMMEDIATE约束   每个声明。在交易之前不会检查DEFERRED约束   承诺。每个约束都有自己的IMMEDIATE或DEFERRED模式。

     

创建后,约束将被赋予以下三个特征之一:   可伸缩的初始延迟,可以直接推迟,或者不是   推迟的。第三类始终是IMMEDIATE,不受影响   SET CONSTRAINTS命令。前两个课程开始   在指示模式下的交易,但他们的行为可以改变   在SET CONSTRAINTS的交易中。

解压缩:可延迟意味着您可以“延迟”检查外键约束直到事务结束。 (顺便说一下,事务基本上都是“查询组”,要么全部成功,要么如果其中一个失败,其他所有查询都会回滚。)

让我们举一个人为的例子:假设您有一个blogs表,其外键指向categories表。当您插入新的博客帖子时,它所链接的类别必须存在 - 否则blogs to categories外键约束将失败。但是......如果我们使用deffered功能,那么我们可以做这样的事情(在伪代码中):

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),除非您知道自己需要它。