仅 Postgres 支持 deferrable


deferrable 即 推迟约束

一、定义字段时指定


定义:exam考试表里 subject_iddddd 字段关联了 subject 科目表的 id 字段

1、原生 SQL


三种:

1.DEFERRABLE INITIALLY DEFERRED

2.DEFERRABLE INITIALLY IMMEDIATE

3.NOT DEFERRABLE

"subject_iddddd" INTEGER REFERENCES "Subjects" ("id") DEFERRABLE INITIALLY IMMEDIATE

注1:IMMEDIATE 会在每一个语句执行后进行约束检查,DEFERRED 则只会在事务结束时才检查约束。(DEFERRED 只是推迟检查而不是不检查)

注2:此设置仅影响 UNIQUE,PRIMARY KEY,REFERENCES (外键)和 EXCLUDE 约束

2、Sequelize


三种:

1.Sequelize.Deferrable.INITIALLY_DEFERRED

2.Sequelize.Deferrable.INITIALLY_IMMEDIATE

3.Sequelize.Deferrable.NOT

Model defined:

……
subject_iddddd: {
type: DataTypes.INTEGER,
references: {
model: 'Subjects',
key: 'id',
deferrable: sequelize.Deferrable.INITIALLY_IMMEDIATE
}
}
……

二、设置当前事务的临时约束检查


1、原生 SQL


SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }

注1:NOT DEFERRABLE 来说,SET CONSTRAINTS 不生效。

注2:SET CONSTRAINTS ALL 更改所有 DEFERRABLE 约束。

2、Sequelize


sequelize.transaction({

// 推迟所有约束:

deferrable: Sequelize.Deferrable.SET_DEFERRED,

// 推迟具体约束:

deferrable: Sequelize.Deferrable.SET_DEFERRED(['some_constraint']),

// 不推迟约束:

deferrable: Sequelize.Deferrable.SET_IMMEDIATE

})

三、应用场景


如果有 province 省份表和 city 城市表,city 表里有 province_id 的字段关联了 province 表的 id 字段。

按照约束,我们合法的操作是先插入安徽省,才能插入合肥市。而先插入合肥市,才能插入安徽省,就会报错:

error: insert or update on table “Citys” violates foreign key constraint “Citys_province_id_fkey"

如何不报错的实现先插入合肥市,才能插入安徽省这个需求呢?

1、给两次插入建立事务

2、用推迟约束


参考资料

https://www.postgresql.org/docs/9.1/static/sql-set-constraints.html

http://dbadailystuff.com/deferred-constraints-in-postgresql

最新文章

  1. 如何设计一个 App 的注册登录流程?
  2. android 两种定时器的实现
  3. .NET Framework 中的字符编码
  4. Java-对象数组排序
  5. RegularExpressionValidator 常用
  6. 第k大数问题
  7. android 之Fragment(官网资料翻译)
  8. JavaScript中return的用法详解
  9. kali权限提升之配置不当提权与WCE
  10. 【AtCoder】【DP】【思维】Prefix Median(AGC012)
  11. Linux Namespace : Mount
  12. Ubuntu16.04中搭建TFTP 和 NFS 服务器
  13. [android开发教程] 一个神奇的Demo 帮你掌握所有android控件
  14. ldap集成rabbitmq
  15. linux xml
  16. git中设置代理,本地不使用代理,针对域名设置代理
  17. AS3获取对象类名,getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName
  18. WebDriverAPI(6)
  19. 修改Java标准库源码
  20. Erlang的Web库和框架

热门文章

  1. GO介绍,环境的配置和安装 简单使用
  2. Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议
  3. Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树
  4. boost--asio
  5. vue中moudles的作用及使用方法
  6. 树形控件(CTreeCtrl和CTreeView)
  7. 爬虫技巧-西瓜视频MP4地址获取
  8. Codeforces812A Sagheer and Crossroads 2017-06-02 20:41 139人阅读 评论(0) 收藏
  9. 14.combobox自动搜索
  10. Maven中的配置文件