Postgresql-constraints

提供:Dev Guides
移動先:案内検索

PostgreSQL-制約

制約は、テーブルのデータ列に適用されるルールです。 これらは、無効なデータがデータベースに入力されるのを防ぐために使用されます。 これにより、データベース内のデータの正確性と信頼性が保証されます。

制約は、列レベルまたは表レベルです。 列レベルの制約は1つの列にのみ適用されますが、表レベルの制約は表全体に適用されます。 列のデータ型を定義すること自体が制約です。 たとえば、DATE型の列は、列を有効な日付に制限します。

以下は、PostgreSQLで一般的に使用される制約です。

  • * NOT NULL制約*-列にNULL値を設定できないようにします。
  • UNIQUE Con​​straint -列のすべての値が異なることを保証します。
  • * PRIMARYキー*-データベーステーブル内の各行/レコードを一意に識別します。
  • FOREIGN Key -他のテーブルの列に基づいてデータを制限します。
  • * CHECK制約*-CHECK制約は、列内のすべての値が特定の条件を満たすことを保証します。
  • * EXCLUSION制約*-EXCLUDE制約により、指定された列または式で指定された演算子を使用して2行が比較された場合、これらの比較のすべてがTRUEを返すわけではありません。

NOT NULL制約

デフォルトでは、列はNULL値を保持できます。 列にNULL値を持たせたくない場合は、この列にNULLが許可されないように指定して、この列にそのような制約を定義する必要があります。 NOT NULL制約は、常に列制約として記述されます。

NULLはデータなしと同じではありません。むしろ、未知のデータを表します。

たとえば、次のPostgreSQLステートメントは、COMPANY1という新しいテーブルを作成し、5つの列を追加します。そのうちの3つであるIDとNAMEとAGEは、NULL値を受け入れないように指定します-

CREATE TABLE COMPANY1(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

一意の制約

UNIQUE制約は、2つのレコードが特定の列に同じ値を持つことを防ぎます。 たとえば、COMPANYテーブルでは、複数の人が同じ年齢になるのを防ぐことができます。

たとえば、次のPostgreSQLステートメントはCOMPANY3という新しいテーブルを作成し、5つの列を追加します。 ここでは、AGE列はUNIQUEに設定されているため、同じ年齢の2つのレコードを持つことはできません-

CREATE TABLE COMPANY3(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL UNIQUE,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

主キー制約

PRIMARY KEY制約は、データベーステーブル内の各レコードを一意に識別します。 UNIQUE列はさらに存在できますが、テーブルには主キーが1つしかありません。 データベーステーブルを設計する場合、主キーは重要です。 主キーは一意のIDです。

これらを使用して、テーブル行を参照します。 主キーは、テーブル間のリレーションを作成するときに、他のテーブルの外部キーになります。 「長年にわたるコーディングの監視」のため、SQLiteでは主キーがNULLになる可能性があります。 これは他のデータベースには当てはまりません

主キーは、データベーステーブル内の各行/レコードを一意に識別するテーブル内のフィールドです。 主キーには一意の値が含まれている必要があります。 主キー列にNULL値を含めることはできません。

テーブルには、単一または複数のフィールドで構成される主キーを1つだけ含めることができます。 複数のフィールドが主キーとして使用される場合、それらは*複合キー*と呼ばれます。

テーブルのいずれかのフィールドで定義された主キーがある場合、そのフィールドの同じ値を持つ2つのレコードを持つことはできません。

上記のさまざまな例を見て、IDを主キーとしてCOMAPNY4テーブルを作成しました-

CREATE TABLE COMPANY4(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

外部キー制約

外部キー制約は、列(または列のグループ)の値が別のテーブルのある行に表示される値と一致する必要があることを指定します。 これにより、2つの関連するテーブル間の参照整合性が維持されます。 これらは外部キーであるため、外部キーと呼ばれます。つまり、テーブルの外です。 外部キーは、参照キーと呼ばれることもあります。

たとえば、次のPostgreSQLステートメントはCOMPANY5という新しいテーブルを作成し、5つの列を追加します。

CREATE TABLE COMPANY6(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

たとえば、次のPostgreSQLステートメントは、3つの列を追加するDEPARTMENT1という新しいテーブルを作成します。 列EMP_IDは外部キーであり、テーブルCOMPANY6のIDフィールドを参照します。

CREATE TABLE DEPARTMENT1(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      references COMPANY6(ID)
);

チェック制約

CHECK制約により、レコードに入力される値を条件でチェックできます。 条件が偽と評価された場合、レコードは制約に違反しており、テーブルに入力されません。

たとえば、次のPostgreSQLステートメントはCOMPANY5という新しいテーブルを作成し、5つの列を追加します。 ここでは、SALARYカラムにCHECKを追加して、SALARYをゼロにすることはできません。

CREATE TABLE COMPANY5(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    CHECK(SALARY > 0)
);

除外制約

除外制約は、指定された演算子を使用して指定された列または式で2行が比較された場合、これらの演算子比較の少なくとも1つがfalseまたはnullを返すようにします。

たとえば、次のPostgreSQLステートメントはCOMPANY7という新しいテーブルを作成し、5つの列を追加します。 ここでは、EXCLUDE制約を追加します-

CREATE TABLE COMPANY7(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT,
   AGE            INT  ,
   ADDRESS        CHAR(50),
   SALARY         REAL,
   EXCLUDE USING gist
   (NAME WITH =,
   AGE WITH <>)
);

ここで、_USING gist_は、構築のために使用し、施行に使用するインデックスのタイプです。

'_データベースごとに1回、_CREATE EXTENSION btree_gist_コマンドを実行する必要があります。 これにより、btree_gist拡張がインストールされ、プレーンスカラーデータ型の除外制約が定義されます。_

私たちは年齢が同じでなければならないことを実施したので、テーブルにレコードを挿入してこれを見てみましょう-

INSERT INTO COMPANY7 VALUES(1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY7 VALUES(2, 'Paul', 32, 'Texas', 20000.00 );
INSERT INTO COMPANY7 VALUES(3, 'Paul', 42, 'California', 20000.00 );

最初の2つのINSERTステートメントの場合、レコードはCOMPANY7テーブルに追加されます。 3番目のINSERT文では、次のエラーが表示されます-

ERROR:  duplicate key value violates unique constraint "company7_pkey"
DETAIL:  Key (id)=(3) already exists.

制約の削除

制約を削除するには、その名前を知る必要があります。 名前がわかっている場合は、簡単に削除できます。 それ以外の場合は、システム生成の名前を見つける必要があります。 ここでは、psqlコマンド\ dテーブル名が役立ちます。 一般的な構文は-

ALTER TABLE table_name DROP CONSTRAINT some_name;