Postgres 的 deferrable
仅 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的更多相关文章
- postgres创建表的过程以及部分源码分析
背景:修改pg内核,在创建表时,表名不能和当前的用户名同名. 首先我们知道DefineRelation此函数是最终创建表结构的函数,最主要的参数是CreateStmt这个结构,该结构如下 typede ...
- postgres索引创建、 存储过程的创建以及在c#中的调用
postgres创建索引参考 http://www.cnblogs.com/stephen-liu74/archive/2012/05/09/2298182.html CREATE TABLE tes ...
- postgres扩展开发
扩展开发的基本组成 demo--1.0.sql demo.c demo.control Makefile demo.c当中包含了自定义函数的实现,纯C语言,目录下可包含多个.c文件.demo-1.0. ...
- oracle迁移postgres之-Ora2Pg
描述 Ora2Pg:甲骨文PostgreSQL数据库模式转换器是一个免费的工具用于Oracle数据库迁移到PostgreSQL兼容模式.它连接Oracle数据库,扫描它自动提取其结构或数据,然后生成S ...
- oracle迁移postgres之-oracle_fdw
1. 安装oracle_fdw 在编译安装前,需要设置postgres的环境变量,如在.bash_profile中增加: export ORACLE_HOME=/u01/app/oracle expo ...
- windows安装postgres源代码
http://blog.csdn.net/adrastos/article/details/9093739 1. 下载PostgreSQL的源代码.解压. 2. 在Windows平台下编译需要跳过一个 ...
- postgres 类型转换 cast 转
转自: http://blog.csdn.net/yufenghyc/article/details/45869509 --1 例子postgres=# select 1/4; ?column? -- ...
- POSTGRES与JDBC对照
POSTGRES与JDBC对照 未经验证,仅供参考.
- 常用到的git,mvn,postgres,vim命令总结
mvn: 打包: mvn package 如果想在打包的时候跳过测试: mvn package -Dmaven.test.skip=true 使用的junit测试框架, 测试: mvn test 如果 ...
随机推荐
- 【转】Linux修改SSH端口和禁止Root远程登陆
Linux修改ssh端口22 vi /etc/ssh/ssh_config vi /etc/ssh/sshd_config 然后修改为port 8888 以root身份service sshd res ...
- Host is not allowed to connect to this MySQL server---------------->windows10
错误,数据库无法远程连接. 第一步,关闭本地防火墙 注意: 两台连接的机器都需要关闭 第二步,两台机器互相ping,看是否可以互相访问 丢失为零,意为可以连接. 第三步登录数据库 第四步,切换,数据库 ...
- POJ 3110 Jenny's First Exam (贪心)
题意:告诉你n 个科目的考试日期,在考试当天不能复习,每一个科目的最早复习时间不能早于考试时间的t天,每一天你可以复习完一科,也只能复习一科,求最晚的复习时间!. 析:由于题目给定的时间都在1900 ...
- xslt 和一个demo
https://www.w3.org/1999/XSL/Transform Specifications The XSLT language has three versions which are ...
- 21-z-index
z-index 这个东西非常简单,它有四大特性,每个特性你记住了,页面布局就不会出现找不到盒子的情况. z-index 值表示谁压着谁,数值大的压盖住数值小的, 只有定位了的元素,才能有z-index ...
- TCP报文首部详解
首部固定部分各字段的意义如下: 1.源端口和目的端口,各占2个字节. 2.序号:占4个字节,序号范围为0到2的32次方-1,序号增加到2的32次方-1之后,下一个序号变为0,在一个TCP连接中传送的字 ...
- MongoDB、redis、memcached
mongodb和memcached不是一个范畴内的东西. mongodb 是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据. memcached,redis mongodb ...
- _ZNote_编程语言_Qt_信号槽实现_拖拽方式使用控件
所谓的信号槽,实际上就是观察者模式. 当某个事件发生后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal). 这种发出信号是没有目的的,类似于广播.如果对象对这个信号感兴趣,它就会使 ...
- Curl工具的使用
Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令. 工具下载 在官网处下载工具包:http:// ...
- 初始Hive
Hive 背景 引入原因 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一推MapReduce代码 对于统计任务,只能由懂MapReduce的程序员才能搞定 耗时耗力,更多精力没有有效 ...