仅 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

Postgres 的 deferrable的更多相关文章

  1. postgres创建表的过程以及部分源码分析

    背景:修改pg内核,在创建表时,表名不能和当前的用户名同名. 首先我们知道DefineRelation此函数是最终创建表结构的函数,最主要的参数是CreateStmt这个结构,该结构如下 typede ...

  2. postgres索引创建、 存储过程的创建以及在c#中的调用

    postgres创建索引参考 http://www.cnblogs.com/stephen-liu74/archive/2012/05/09/2298182.html CREATE TABLE tes ...

  3. postgres扩展开发

    扩展开发的基本组成 demo--1.0.sql demo.c demo.control Makefile demo.c当中包含了自定义函数的实现,纯C语言,目录下可包含多个.c文件.demo-1.0. ...

  4. oracle迁移postgres之-Ora2Pg

    描述 Ora2Pg:甲骨文PostgreSQL数据库模式转换器是一个免费的工具用于Oracle数据库迁移到PostgreSQL兼容模式.它连接Oracle数据库,扫描它自动提取其结构或数据,然后生成S ...

  5. oracle迁移postgres之-oracle_fdw

    1. 安装oracle_fdw 在编译安装前,需要设置postgres的环境变量,如在.bash_profile中增加: export ORACLE_HOME=/u01/app/oracle expo ...

  6. windows安装postgres源代码

    http://blog.csdn.net/adrastos/article/details/9093739 1. 下载PostgreSQL的源代码.解压. 2. 在Windows平台下编译需要跳过一个 ...

  7. postgres 类型转换 cast 转

    转自: http://blog.csdn.net/yufenghyc/article/details/45869509 --1 例子postgres=# select 1/4; ?column? -- ...

  8. POSTGRES与JDBC对照

    POSTGRES与JDBC对照 未经验证,仅供参考.

  9. 常用到的git,mvn,postgres,vim命令总结

    mvn: 打包: mvn package 如果想在打包的时候跳过测试: mvn package -Dmaven.test.skip=true 使用的junit测试框架, 测试: mvn test 如果 ...

随机推荐

  1. MVC 开发模式

    1.M:Model  模型:实体类和业务和dao 2.V:view  视图:JSP 3.C:Controller  控制器:servlet 3.1 作用:视图和逻辑分离 4.MVC适用场景:大型项目开 ...

  2. ORA-38301:can not perform DDL/DML over objects in Recycle Bin

    一个智障操作,drop一个用户,下面的东西比较多,删得比较慢,然后shell突然关了. 就导致了,删不掉,又不能创建新的用户.出版本要得比较急,就先创建新的用户测试去了. 今天要弄个东西,又想起这个事 ...

  3. 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)

    传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...

  4. .NET性能优化(文摘)

    第1章 性能指标 1.1 性能目标 1.2 性能指标 第2章 性能度量 2.1 性能度量方式 白盒测试-小程序 黑盒测试-大型程序 2.2 Windows内置工具 2.2.1 性能计数器 2.2.2  ...

  5. tflite笔记

    固化模型 方法一:freeze_graph方法 把tf.train.write_graph()生成的pb文件与tf.train.saver()生成的chkp文件固化之后重新生成一个pb文件 with ...

  6. myeclipse cannot connect to vm

    启动tomcat时,tomcat可以直接运行,而debug时弹出 解决方法:打开360安全卫士的功能大全找到修复网络(LSP)点击立即修复就可以使用debug

  7. Mysql通过sql语句添加约束和查看约束

    一:添加约束 1.添加唯一约束:alter table student add constraint uk_name unique(name); 2.添加外键约束: alter table 表名 ad ...

  8. Effective C++ 随笔(3)

    条款12: 以对象管理资源 两种只能指针: std:auto_ptr<> 当使用copy操作室,原先的智能指针指向为null std:tr1:share_ptr<int> sp ...

  9. AngularJS实战之filter的使用一

    一.格式化数字为货币格式. <div>{{money|currency:"$"}}</div> <div>{{money|currency:&q ...

  10. 进程之multiprocessing

    进程的状态: