ホームページ データベース 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

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Douyuライブ配信の遅延を消す方法は?・Douyu生放送のリプレイを見るにはどうすればいいですか? Douyuライブ配信の遅延を消す方法は?・Douyu生放送のリプレイを見るにはどうすればいいですか? Mar 18, 2024 am 10:55 AM

Douyuライブ配信の遅延を消す方法は? 1. 図に示すように、ユーザーはまずクリックして Douyu Live に入ります。 2. 次に、図に示すように、ユーザーは「Douyu Live」ウィンドウの「設定」をクリックします。 3. 次に、図に示すように、[設定] ウィンドウで [詳細] をクリックします。 4. 最後に、図に示すように、[詳細] ウィンドウで、ユーザーは [デフォルトで低遅延モードがオンになります] をオフにすることで遅延をキャンセルできます。 Douyu生放送のリプレイを見るにはどうすればいいですか? 1. 最初のステップでは、まずコンピュータのデスクトップで Douyu ライブ ブロードキャスト ソフトウェアのアイコンを見つけ、右クリックして [開く] オプションを選択します。 2. 2 番目のステップでは、Douyu ライブ ブロードキャスト ソフトウェアを開いた後、ページの左側にある「フォロー」オプションをクリックしてこのオプションを開き、右側のページで好みのホストを見つけて「録画」オプションをクリックします。 3. 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 におけるメッセージ遅延とメッセージ再試行におけるキュー テクノロジーの応用概要: Web アプリケーションの継続的な開発に伴い、高い同時処理とシステムの信頼性に対する要求がますます高まっています。解決策として、キュー テクノロジーはメッセージ遅延機能とメッセージ再試行機能を実装するために PHP と MySQL で広く使用されています。この記事では、キューの基本原理、キューを使用してメッセージ遅延を実装する方法、キューを使用してメッセージの再試行を実装する方法など、PHP および MySQL におけるキュー テクノロジのアプリケーションを紹介します。

Go 言語でデータベース関数を学習し、PostgreSQL データの追加、削除、変更、クエリ操作を実装します。 Go 言語でデータベース関数を学習し、PostgreSQL データの追加、削除、変更、クエリ操作を実装します。 Jul 31, 2023 pm 12:54 PM

Go 言語でデータベース関数を学習し、PostgreSQL データの追加、削除、変更、クエリ操作を実装する現代のソフトウェア開発において、データベースは不可欠な部分です。 Go 言語は強力なプログラミング言語として、データベースの追加、削除、変更、クエリ操作を簡単に実装できる豊富なデータベース操作関数とツールキットを提供します。この記事では、Go言語でデータベース機能を学び、実際の運用でPostgreSQLデータベースを利用する方法を紹介します。ステップ 1: 各データベースに Go 言語でデータベース ドライバーをインストールする

薬は病気を治す: 勝つための 1 つのトリック、PHP サーバーの最適化の問題を完全に解決し、ラグに別れを告げましょう! 薬は病気を治す: 勝つための 1 つのトリック、PHP サーバーの最適化の問題を完全に解決し、ラグに別れを告げましょう! Feb 20, 2024 am 09:43 AM

PHP は人気のある WEB 開発言語ですが、スタックや遅延の問題がよく発生します。これはユーザー エクスペリエンスに影響を与えるだけでなく、開発者や運用保守担当者にとって頭痛の種にもなります。この問題を解決するために、さまざまなチームや機関がさまざまなソリューションを提案していますが、そのうちの 1 つが傑出しており、その効率性と信頼性で多くの賞賛を獲得しています。根本的な問題を特定する PHP の遅延の問題を解決するには、最初のステップとして根本的な問題を特定する必要があります。最も一般的な理由は次のとおりです。 システム構成: CPU、RAM、ディスク容量などの十分なシステム リソースの不足。ソフトウェア環境: PH​​P 自体、Web サーバー、関連プラグインなどの 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

スーパー ヒューマン ゲームでは、一部のプレイヤーがログインの遅延を経験しました。もう一度試してください。確認ボタンをクリックすると、すぐに GeeGee クライアントを終了するよう求められます。今日は解決策をご紹介しましたので、ぜひご覧ください。 Super human のログインが遅れています。もう一度お試しください。「Steammustberunningtoplaythisgame」という解決策は、おそらく Steam でこのゲームを実行することが許可されていないことを意味します。 steamがインストールされていない、管理者として実行されていない、またはスタックしている可能性があります。解決策: 1. 最初の方法は、steam プラットフォームをダウンロードし、インストール ディスクを開き、クラック フォルダーの内容をゲーム フォルダーに入れることです。 2

See all articles