데이터 베이스 MySQL 튜토리얼 Postgres约束延迟生效(deferrable)

Postgres约束延迟生效(deferrable)

Jun 07, 2016 pm 02:58 PM
p 지연 효력을 발휘하다 강제

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里的语法和概念也是差不多这样,很相近的。

 

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Douyu 라이브 방송에서 지연을 끄는 방법은 무엇입니까? -두유 라이브 방송 다시보기는 어떻게 하나요? Douyu 라이브 방송에서 지연을 끄는 방법은 무엇입니까? -두유 라이브 방송 다시보기는 어떻게 하나요? Mar 18, 2024 am 10:55 AM

Douyu 라이브 방송에서 지연을 끄는 방법은 무엇입니까? 1. 사용자는 먼저 그림과 같이 Douyu Live를 클릭하여 입장합니다. 2. 그런 다음 사용자는 그림과 같이 "Douyu Live" 창에서 "설정"을 클릭합니다. 3. 그런 다음 그림과 같이 "설정" 창에서 "고급"을 클릭합니다. 4. 마지막으로 "고급" 창에서 사용자는 그림과 같이 "낮은 대기 시간 모드가 기본적으로 켜져 있습니다"를 꺼서 지연을 취소할 수 있습니다. Douyu 라이브 방송 다시보기는 어떻게 시청하나요? 1. 첫 번째 단계에서는 먼저 컴퓨터 바탕 화면에서 Douyu 라이브 방송 소프트웨어 아이콘을 찾은 다음 마우스 오른쪽 버튼을 클릭하고 "열기" 옵션을 선택합니다. 2. 두 번째 단계에서는 Douyu 라이브 방송 소프트웨어를 연 후 다음을 찾습니다. 페이지 왼쪽의 "팔로우" 옵션을 클릭하여 이 옵션을 열고 오른쪽 페이지에서 원하는 호스트를 찾으세요. "녹음" 옵션을 클릭하세요. 3. 세 번째 단계로 진행하세요.

VSCode의 중국어 인터페이스가 적용되지 않으면 어떻게 해야 합니까? VSCode의 중국어 인터페이스가 적용되지 않으면 어떻게 해야 합니까? Mar 26, 2024 am 10:24 AM

제목: VSCode의 중국어 인터페이스가 적용되지 않으면 어떻게 해야 합니까? 오픈 소스이자 강력한 무료 코드 편집기인 Visual Studio Code(약칭 VSCode)는 대다수 개발자의 사랑을 받고 있습니다. 그러나 때때로 VSCode를 사용할 때 중국어 인터페이스가 적용되지 않는 등의 문제가 발생할 수 있습니다. 오늘 우리는 이 문제에 대해 논의하고 해결책을 제시할 것입니다. 문제 설명: VSCode를 사용할 때 일부 사용자는 설정 방법에 관계없이 인터페이스가

PHP 및 MySQL의 메시지 지연 및 메시지 재시도에 큐 기술 적용 PHP 및 MySQL의 메시지 지연 및 메시지 재시도에 큐 기술 적용 Oct 15, 2023 pm 02:26 PM

PHP 및 MySQL의 메시지 지연 및 메시지 재시도에 대한 큐 기술 적용 요약: 웹 애플리케이션의 지속적인 개발로 인해 높은 동시 처리 및 시스템 안정성에 대한 요구가 점점 더 높아지고 있습니다. 이에 대한 해결책으로 큐 기술은 메시지 지연 및 메시지 재시도 기능을 구현하기 위해 PHP 및 MySQL에서 널리 사용됩니다. 이 기사에서는 큐의 기본 원리, 큐를 사용하여 메시지 지연을 구현하는 방법, 큐를 사용하여 메시지 재시도를 구현하는 방법을 포함하여 PHP 및 MySQL의 큐 기술 적용을 소개하고 다음을 제공합니다.

Go 언어로 데이터베이스 기능을 배우고 PostgreSQL 데이터의 추가, 삭제, 수정 및 쿼리 작업을 구현합니다. Go 언어로 데이터베이스 기능을 배우고 PostgreSQL 데이터의 추가, 삭제, 수정 및 쿼리 작업을 구현합니다. Jul 31, 2023 pm 12:54 PM

Go 언어의 데이터베이스 기능을 배우고 PostgreSQL 데이터의 추가, 삭제, 수정 및 쿼리 작업을 구현합니다. 현대 소프트웨어 개발에서 데이터베이스는 없어서는 안 될 부분입니다. 강력한 프로그래밍 언어인 Go 언어는 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 쉽게 구현할 수 있는 풍부한 데이터베이스 작업 기능과 툴킷을 제공합니다. 이번 글에서는 Go 언어로 데이터베이스 기능을 익히고 PostgreSQL 데이터베이스를 실제 작업에 활용하는 방법을 소개합니다. 1단계: 각 데이터베이스에 대해 Go 언어로 데이터베이스 드라이버 설치

약이 질병을 치료합니다. 승리할 수 있는 한 가지 비결은 PHP 서버 최적화 문제를 완전히 해결하고 지연과 작별하는 것입니다! 약이 질병을 치료합니다. 승리할 수 있는 한 가지 비결은 PHP 서버 최적화 문제를 완전히 해결하고 지연과 작별하는 것입니다! Feb 20, 2024 am 09:43 AM

PHP는 널리 사용되는 WEB 개발 언어이지만 종종 정체 및 지연 문제에 직면합니다. 이는 사용자 경험에 영향을 미칠 뿐만 아니라 개발자와 운영 및 유지 관리 담당자에게 골치 아픈 일이 됩니다. 이 문제를 해결하기 위해 다양한 팀과 기관에서 다양한 솔루션을 제안해 왔지만 그 중 한 가지가 눈에 띄며 효율성과 신뢰성에 대해 많은 칭찬을 받았습니다. 근본 문제 식별 PHP 지연 및 지연 문제를 해결하려면 첫 번째 단계는 근본 문제를 식별하는 것입니다. 가장 일반적인 이유는 다음과 같습니다. 시스템 구성: CPU, RAM, 디스크 공간을 포함한 시스템 리소스가 부족합니다. 소프트웨어 환경: PHP 자체, 웹 서버 및 관련 플러그인을 포함한 PHP 관련 소프트웨어의 부적절한 구성. 네트워크 문제: PHP 서버와 다른 시스템 간의 견고한 네트워크 또는 관계가 부족합니다.

Java의 네트워크 대기 시간 문제를 해결하는 방법 Java의 네트워크 대기 시간 문제를 해결하는 방법 Oct 08, 2023 am 11:21 AM

Java에서 네트워크 지연 문제를 해결하는 방법 네트워크 지연은 데이터 전송 프로세스 중 다양한 이유로 인해 데이터 전송과 수신 사이의 시간 지연을 의미합니다. 네트워크 통신을 수행하거나 네트워크 애플리케이션을 개발할 때 네트워크 대기 시간 문제가 자주 발생합니다. 이 기사에서는 Java의 네트워크 대기 시간 문제를 해결하는 몇 가지 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 멀티스레딩 사용 네트워크 지연은 일반적으로 네트워크 요청 차단으로 인해 발생합니다. 메인 스레드를 차단하는 네트워크 요청을 피하기 위해 멀티스레딩을 사용하여 네트워크를 처리할 수 있습니다.

Windows 10에서 마우스로 창을 끌 때 지연 문제를 해결하는 방법 Windows 10에서 마우스로 창을 끌 때 지연 문제를 해결하는 방법 Jan 06, 2024 pm 05:28 PM

win10 시스템을 사용하는 과정에서 마우스로 창을 드래그할 때 지연 및 멈춤 현상이 발생하면 편집자는 시스템 설정 문제나 드라이버 문제라고 생각합니다. 드라이버를 다시 설치하거나 작업 중 main.cpl 코드를 사용하여 문제를 해결할 수 있습니다. Win10에서 마우스로 창을 드래그할 때 발생하는 지연에 대한 자세한 해결 방법을 살펴보겠습니다. Win10에서 마우스로 창을 드래그할 때 지연이 발생하는 경우 해결 방법: 방법 1(유선 및 무선 공통): 1. Win10 시스템 바탕 화면에서 "win+r" 단축키를 눌러 실행 창을 엽니다. , main.cpl을 입력하고 Enter를 눌러 확인합니다. 2. 그런 다음 마우스 속성 대화 상자를 열고 마우스 버튼을 클릭한 다음 "두 번 클릭 속도"에서 커서를 밀어 마우스 두 번 클릭 속도를 조정합니다. 3. 그런 다음

슈퍼휴먼 로그인이 지연되고 있습니다. 다시 시도해 주세요. 슈퍼휴먼 로그인이 지연되고 있습니다. 다시 시도해 주세요. Mar 30, 2024 pm 08:31 PM

Super Human 게임에서 일부 플레이어의 로그인 지연이 발생했습니다. 다시 시도해 주세요. 확인 버튼을 클릭하면 즉시 GeeGee 클라이언트를 종료하라는 메시지가 표시됩니다. 오늘 제가 해결 방법을 제시했으니 와서 살펴보세요. 슈퍼휴먼 로그인이 지연되었습니다. "Steammustberrunning to play this game"이라는 해결 방법은 아마도 Steam에서 이 게임을 실행할 수 없다는 뜻일 것입니다. 스팀이 설치되어 있지 않아서일 수도 있고, 관리자 권한으로 실행되지 않아서일 수도 있고, 멈췄을 수도 있습니다. 해결 방법: 1. 첫 번째 방법은 Steam 플랫폼을 다운로드하고 설치 디스크를 열고 crack 폴더의 내용을 게임 폴더에 넣는 것입니다. 2

See all articles