2017-02-27 44 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),除非你知道你需要它。