仅 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. linux中命令突然不能用

    先用:echo $PATH 发现path丢失:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 于是用临时环境变量 export ...

  2. oracle 重建分区索引

    分区表的所有分区相当于一个单独的表. 创建在分区表上的索引,就相当于在所有分区上单独创建的索引(主键索引除外). 重建分区表的索引回报: ORA-14086:不能将分区索引作为整体重建. so,重建语 ...

  3. 使用bat批处理文件定时自动备份oracle数据库并上传ftp服务器

    一.使用bat批处理文件备份oracle(前提是配置好oracle数据库客户端) @echo off set databasename=orcl  //数据库名 set username=ninic ...

  4. rm与管道使用

    一 问题初始:用通常意义的管道使用这样可以:(1)ls -l | sed -n '/~$/p' 我用显示出系统自己建立的备份文件这时,我想删除这些文件,我仍然使用了管道,并执行了以下命令(2)ls - ...

  5. Solidity合约:玉米生产溯源

    实现思路: 首先用地址与每个结构进行映射,将关键信息储存在结构体中:或者将关键信息在外部通过json储存,内部储存对应的hash值: 使用issue函数表示:玉米地中收获足够数量的玉米并进行记录: 使 ...

  6. Promise.all函数的使用

    Promise.all([this.getCity('guess'),this.getCity('hot'),this.getCity('group')]).then(res=>{ // con ...

  7. PHP移植小记

    所需文件: Phpnow 1.5.6 文件夹(D盘): SQL Server2005 x86 安装包(D盘‘安装文件文件夹’): 数据库创建命令:   更改sql server 2005的服务器名称 ...

  8. bzoj2002(lct模板)

    #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #inclu ...

  9. 网络编程socket、udp

    PS:主机字节顺序,个位在低字节上 计算机本身不能通讯,使通过在同一主机或者不同主机内的软件进行数据传输. 套接字socket:套接字socket可以参照文件指针来理解,文件指针是表示对文件打开进行某 ...

  10. http基本概念