Postgres约束延迟生效(deferrable) Postgres建表时可以指定各种约束,但还有几个不常见的参数可以来控制约束的即时生效或者延迟生效。 OS:CentOS 6.2 DB:Postgres 9.1.3 1.建表语句 CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [
Postgres约束延迟生效(deferrable)
Postgres建表时可以指定各种约束,但还有几个不常见的参数可以来控制约束的即时生效或者延迟生效。
OS:CentOS 6.2
DB:Postgres 9.1.3
1.建表语句
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
OF type_name [ (
{ column_name WITH OPTIONS [ column_constraint [ ... ] ]
| table_constraint }
[, ... ]
) ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
where column_constraint is:
[ CONSTRAINT constraint_name ]
{ NOT NULL |
NULL |
CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr |
UNIQUE index_parameters |
PRIMARY KEY index_parameters |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
and table_constraint is:
[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) [ NO INHERIT ] |
UNIQUE ( column_name [, ... ] ) index_parameters |
PRIMARY KEY ( column_name [, ... ] ) index_parameters |
EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
2.文档释义
DEFERRABLE
NOT DEFERRABLE
This controls whether the constraint can be deferred. A constraint that is not deferrable will be checked immediately after every command. Checking of constraints that are deferrable can be postponed until the end of the transaction (using the SET CONSTRAINTS command). NOT DEFERRABLE is the default. Currently, only UNIQUE, PRIMARY KEY, EXCLUDE, and REFERENCES (foreign key) constraints accept this clause. NOT NULL and CHECK constraints are not deferrable.
INITIALLY IMMEDIATE
INITIALLY DEFERRED
If a constraint is deferrable, this clause specifies the default time to check the constraint. If the constraint is INITIALLY IMMEDIATE, it is checked after each statement. This is the default. If the constraint is INITIALLY DEFERRED, it is checked only at the end of the transaction. The constraint check time can be altered with the SET CONSTRAINTS command.
SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }
大概说明一下, DEFERRABLE| NOT DEFERRABLE这个参数控制着约束是否可被延迟生效,当约束设置是非延迟时将会对每一个命令立即进行检查,当约束设置可延迟生效时可以使用set constraints命令来推迟检查直到事务结束,默认是非延迟。当前,只有UNIQUE,PK,exclude,FK可以延迟,NOT NULL和CHECK都是非延迟,这点和ORACLE有所不同,oracle中check也可以延迟。
当约束是可延迟生效时,这个可以选择检查时间来检查约束,如INITIALLY IMMEDIATE,它会在每一个语句执行后进行检查,而INITIALLY DEFERRED则会只在事务结束时才检查,选项可以通过SET CONSTRAINTS来更改。
set constraints中可以设置all或者name,name是约束名称,可以在pg_constraint中查询,可见下例
总的来说
非延迟是立即生效的,不允许延迟
延迟生效初始化立即生效是对每个语句结束时检查
延迟生效初始化延迟生效是直到事务完成才检查(可使用set constraints调整)
3.例子说明
a.非延迟(not deferrable)
[postgres@localhost ~]$ psql -d db_kenyon
Password:
psql (9.1.3)
Type "help" for help.
db_kenyon=# create table t_kenyon(id int primary key not deferrable);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t_kenyon_pkey" for table "t_kenyon"
CREATE TABLE
db_kenyon=# insert into t_kenyon values(1);
INSERT 0 1
db_kenyon=# begin;
BEGIN
db_kenyon=# insert into t_kenyon values(1);
ERROR: duplicate key value violates unique constraint "t_kenyon_pkey"
DETAIL: Key (id)=(1) already exists.
db_kenyon=# begin;
BEGIN
db_kenyon=# set constraints all deferred;
SET CONSTRAINTS
db_kenyon=# insert into t_kenyon values(1);
ERROR: duplicate key value violates unique constraint "t_kenyon_pkey"
DETAIL: Key (id)=(1) already exists.
可以 看到设置非延迟时插入违反约束的数据是会立即报错的,即使设置约束延迟也没用
b.延迟生效之 INITIALLY IMMEDIATE
db_kenyon=# drop table t_kenyon;
DROP TABLE
db_kenyon=# create table t_kenyon(id int primary key deferrable initially immediate);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t_kenyon_pkey" for table "t_kenyon"
CREATE TABLE
db_kenyon=# insert into t_kenyon values(1);
INSERT 0 1
db_kenyon=# insert into t_kenyon values(1);
ERROR: duplicate key value violates unique constraint "t_kenyon_pkey"
DETAIL: Key (id)=(1) already exists.
db_kenyon=# begin transaction;
BEGIN
db_kenyon=# insert into t_kenyon values(1);
ERROR: duplicate key value violates unique constraint "t_kenyon_pkey"
DETAIL: Key (id)=(1) already exists.
db_kenyon=# rollback;
ROLLBACK
db_kenyon=# end;
WARNING: there is no transaction in progress
COMMIT
db_kenyon=# begin transaction;
BEGIN
db_kenyon=# set constraints all deferred;
SET CONSTRAINTS
db_kenyon=# insert into t_kenyon values(1);
INSERT 0 1
db_kenyon=# set constraints all immediate;
ERROR: duplicate key value violates unique constraint "t_kenyon_pkey"
DETAIL: Key (id)=(1) already exists.
可以看到是有区别的,再来看看另外一个场景
c.延迟生效之 INITIALLY DEFERRED
db_kenyon=# create table t_kenyon(id int primary key deferrable initially deferred);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t_kenyon_pkey" for table "t_kenyon"
CREATE TABLE
db_kenyon=# insert into t_kenyon values(1);
INSERT 0 1
db_kenyon=# begin;
BEGIN
db_kenyon=# insert into t_kenyon values(1);
INSERT 0 1
db_kenyon=# insert into t_kenyon values(2);
INSERT 0 1
db_kenyon=# commit;
ERROR: duplicate key value violates unique constraint "t_kenyon_pkey"
DETAIL: Key (id)=(1) already exists.
db_kenyon=# end;
WARNING: there is no transaction in progress
COMMIT
db_kenyon=# select conname from pg_constraint where contype = 'p';
conname
---------------
t_kenyon_pkey
(1 row)
db_kenyon=# begin;
BEGIN
db_kenyon=# insert into t_kenyon values(1);
INSERT 0 1
db_kenyon=# set constraints t_kenyon_pkey immediate;
ERROR: duplicate key value violates unique constraint "t_kenyon_pkey"
DETAIL: Key (id)=(1) already exists.
这里应该了然了,延迟的两种方式可以在事务里自行切换,如果设置非延迟就不行,这就是区别。ORACLE里的语法和概念也是差不多这样,很相近的。

标题:VSCode中文界面无法生效怎么办?VisualStudioCode(简称VSCode)作为一款开源、免费且功能强大的代码编辑器,受到了广大开发者的喜爱。然而,有时候在使用VSCode的过程中,会遇到一些问题,比如中文界面无法生效的情况。今天我们就来探讨一下这个问题,并给出解决方法。问题描述有些用户在使用VSCode时,可能会发现无论怎么设置,界

斗鱼直播怎么关闭延迟?1、用户首先点击进入斗鱼直播,如图所示。2、接着用户在“斗鱼直播”窗口中点击“设置”,如图所示。3、然后在“设置”窗口中,点击“高级”,如图所示。4、最后用户在“高级”窗口中,将“低延时模式默认开启”关闭就能取消延迟了,如图所示。斗鱼直播怎么看回放?1、第一步,我们先找到电脑桌面上的斗鱼直播软件图标,然后右键单击选择“打开”选项2、第二步,打开斗鱼直播软件之后,我们在页面左侧找到“关注”选项,点击打开该选项并在右侧页面中找到一个自己喜欢的主播,点击“录像”选项3、第三步,进

学习Go语言中的数据库函数并实现PostgreSQL数据的增删改查操作在现代的软件开发中,数据库是不可或缺的一部分。Go语言作为一门强大的编程语言,提供了丰富的数据库操作函数和工具包,可以轻松地实现数据库的增删改查操作。本文将介绍如何学习Go语言中的数据库函数,并使用PostgreSQL数据库进行实际的操作。第一步:安装数据库驱动程序在Go语言中,每个数据库

队列技术在PHP与MySQL中的消息延迟和消息重试的应用摘要:随着Web应用程序的不断发展,对于高并发处理和系统可靠性方面的需求越来越高。队列技术作为一种解决方案,被广泛应用于PHP与MySQL中,以实现消息延迟和消息重试的功能。本文将介绍队列技术在PHP与MySQL中的应用,包括队列的基本原理、使用队列实现消息延迟的方法和使用队列实现消息重试的方法,并给出

如何解决Java中的网络延迟问题网络延迟是指在数据传输过程中,由于各种原因导致数据的发送和接收之间出现的时间延迟。在进行网络通信或者开发网络应用程序时,我们经常会遇到网络延迟的问题。本文将介绍一些解决Java中网络延迟问题的方法,并提供具体的代码示例。一、使用多线程网络延迟通常是由于网络请求的阻塞导致的。为了避免网络请求阻塞主线程,我们可以使用多线程来处理网

在使用win10系统的过程中,如果遇到了鼠标拖动窗口有延迟卡顿的情况,小编觉得应该是系统设置的问题或者是驱动问题。可以尝试重装驱动或者是在运行中使用main.cpl代码来解决问题,快来看看详细的win10鼠标拖动窗口有延迟解决方法吧。win10鼠标拖动窗口有延迟怎么办:方法一(有线无线通用):1、在win10系统桌面,按下“win+r”快捷键,打开运行窗口,输入:main.cpl然后回车确定。2、然后打开鼠标属性对话框,点击鼠标键,可以通过滑动“双击速度”中的游标来调整鼠标双击速度。3、然后点击

PHP作为广受欢迎的WEB开发语言,但时常会遇到卡顿和延迟的问题。这不僅影响了用户體驗,也让开发者和运維人員感到头疼。为了解决这一难题,多方团队和机构提出了多种解决方案,其中一款脱颖而出,以其高效性和可靠性获得了众多赞誉。识别根源问题要解决php卡顿和延迟难题,第一步必须是识别根源問題。最常见的原因为:系统配置:缺乏足够的系统資源,包括CPU、RAM和磁盘空间。软件环境:PHP相关软件的配置不当,包括PHP本身、Web伺服器和相关插件。网络问题:缺乏穩固的网络,或PHP伺服器与其他系统之間的关系

在超级人类游戏中有玩家遇到了登录发生延迟。请重试。点击确认按钮将立即退出GeeGee客户端的提示,今天小编就带来了解决的方法,快来一起看看吧。超级人类登录发生延迟请重试解决方法“Steammustberunningtoplaythisgame”这个提示的大概意思是steam不允许运行这个游戏。可能是因为没有安装steam的原因,也有可能是没有用管理员身份运行的原因,或者可能是卡了的原因。解决方法:1、第一种方法是下载一个steam平台,并打开安装盘,把crack文件夹里的东西放到游戏文件夹里。2


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver CS6
视觉化网页开发工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境