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 如果 ...
随机推荐
- LD_LIBRARY_PATH
LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径. 在linux下可以用export命令来设置这个值,比如 在linux ...
- h5常用标签语义
<article>定义页面独立的内容区域.例如外部来的文章. <aside>定义页面的侧边栏内容.<aside> 标签定义 <article> 标签外的 ...
- 36、NSTimer使用详解-开启、关闭、移除
1.要是用一个定时器,首先要定义一个定时器: @property(strong,nonatomic)NSTimer *myTimer;//定时器 2.初始化,初始化有两种方式: 第一种: + (NST ...
- 关于页面传值页面的跳转,以及spring mvc 框架的流程问题
list页面 1.点击页面后,进入后台的list方法中,通过findPage()查询数据的,findPage中含有findList(): 2.如果页面没有输入查询条件,那么则显示所有数据集合,如果页面 ...
- boost--线程同步
1.互斥锁(互斥量) mutex是独占式的互斥锁.timed_mutex增加了超时功能. 成员函数:lock()用于锁定,try_lock()为非阻塞版本的锁定,unlock()用于解锁.timed_ ...
- TCP/IP协议(6):传输层之UDP
一. UDP用户数据报协议,它是一个无连接的,面向数据报的协议,它不提供可靠性但传输速度比TCP要快. UDP数据报中的“UDP长度”为两个字节,所以我们要发送的UDP数据最多支持65507大约68K ...
- c# devexpress绘图 三角函数
加标题: using System; using System.Windows.Forms; using DevExpress.XtraCharts; // ... namespace SideByS ...
- Java四种排序:冒泡,选择,插入,二分(折半插入)
四种排序:冒泡,选择,插入,二分(折半插入) public class Test{ // public static void main(String[] args) { // Test t=new ...
- Ubuntu Server 命令行下的默认语言改为英语en_US.UTF-8
源文链接:http://tonychiu.blog.51cto.com/656605/393131 如果Ubuntu Server在安装过程中,选择的是中文(很多新手都会在安装时选择中文,便于上手), ...
- ZUFE2481 神奇的字符串 2017-05-12 16:41 39人阅读 评论(0) 收藏
2481: 神奇的字符串 时间限制: 3 Sec 内存限制: 256 MB 提交: 8 解决: 3 [提交][状态][讨论版] 题目描述 输入 输出 样例输入 abcb 1000 1100 350 ...