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
最新文章
- 如何设计一个 App 的注册登录流程?
- android 两种定时器的实现
- .NET Framework 中的字符编码
- Java-对象数组排序
- RegularExpressionValidator 常用
- 第k大数问题
- android 之Fragment(官网资料翻译)
- JavaScript中return的用法详解
- kali权限提升之配置不当提权与WCE
- 【AtCoder】【DP】【思维】Prefix Median(AGC012)
- Linux Namespace : Mount
- Ubuntu16.04中搭建TFTP 和 NFS 服务器
- [android开发教程] 一个神奇的Demo 帮你掌握所有android控件
- ldap集成rabbitmq
- linux xml
- git中设置代理,本地不使用代理,针对域名设置代理
- AS3获取对象类名,getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName
- WebDriverAPI(6)
- 修改Java标准库源码
- Erlang的Web库和框架
热门文章
- GO介绍,环境的配置和安装 简单使用
- Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议
- Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树
- boost--asio
- vue中moudles的作用及使用方法
- 树形控件(CTreeCtrl和CTreeView)
- 爬虫技巧-西瓜视频MP4地址获取
- Codeforces812A Sagheer and Crossroads 2017-06-02 20:41 139人阅读 评论(0) 收藏
- 14.combobox自动搜索
- Maven中的配置文件