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 如果 ...
随机推荐
- 谈互联网开放平台:“去中心化”大势所趋 zz
文/磐石之心 几天前与好友聊到众筹咖啡馆的事情,他向我讲述了一个非常具有特色的众筹咖啡馆案例.而这个案例也引发我对当前互联网开放.去中心和集权的一些思考,今天就简单写出来与大家分享. 一个无赚钱目的的 ...
- WM_PAINT和WM_ERASEBKGND消息
1.OnPaint()函数是窗口重绘消息WM_PAINT的响应函数,当窗口重绘时会产生WM_ERASEBKGND消息和WM_PAINT消息,而且WM_ERASEBKGND会先于WM_PAINT产生,所 ...
- linux利用命令将一个盘上的所有复制到另一个盘上
1.fdisk -l 查看硬盘状况 2.将目标盘利用mount挂载 3.查看硬盘使用状况,看目标盘是否有足够的空间:df -h 4.如果足够,利用dd命令将源盘数据拷贝到目标盘:dd if=/dev/ ...
- Oracle 导出错误 EXP-00000~EXP-00107
EXP-00000: Export terminated unsuccessfully Cause: Export encountered an Oracle error. Action: Look ...
- fork、vfork、clone
三个都是用来创建新进程的函数 fork 概念 1)fork函数调用一次会返回两次,给父进程返回子进程的进程ID,给子进程返回0(这么设计的原因:父进程可以有很多子进程,没有一个函数可以让父进程知道所有 ...
- Spring 整合 RocketMQ
1. 引入jar包 <!-- RocketMQ --> <dependency> <groupId>com.alibaba.rocketmq</groupId ...
- c语言:简单排序:冒泡排序法、选择排序法、插入排序法(待写)
1.冒泡排序法: 假设有n个数需要按从小到大排序,冒泡排序的原理是,在这一排数字中,将第一个数与第二个数比较大小,如果后面的比前面的小,就将他们交换位置.然后再比较第二个和第三个,再交换,直到第n-1 ...
- android ActivityGroup接收不到onActivityResult
android 框架嵌套,用viewgroup是很好用的.首先实现一个框架的activity,可以继承ActivityGroup 将需要切换的界面,放到ViewGroup里面. 切换如下: Inten ...
- HDU3506环形石子合并问题
HDU3506环形石子合并问题 线性的石子合并问题比较好理解,环形的转成线性的方法就是扩展数组 1 2 3 . . . n 1 2 3 ... n 依据是我们最优的取值可以是 1 --- n也能是 2 ...
- spring 框架整合mybatis的源码分析
问题:spring 在整合mybatis的时候,我们是看不见sqlSessionFactory,和sqlsession(sqlsessionTemplate 就是sqlsession的具体实现)的,这 ...