PostgreSQL - 約束



約束是表上資料列強制執行的規則。這些規則用於防止將無效資料輸入資料庫。這確保了資料庫中資料的準確性和可靠性。

約束可以是列級或表級。列級約束僅應用於一列,而表級約束則應用於整個表。為列定義資料型別本身就是一種約束。例如,DATE 型別的列將該列約束為有效日期。

以下是 PostgreSQL 中常用的約束。

  • NOT NULL 約束 - 確保列不能具有 NULL 值。

  • UNIQUE 約束 - 確保列中的所有值都不同。

  • PRIMARY KEY(主鍵) - 唯一標識資料庫表中的每一行/記錄。

  • FOREIGN KEY(外部索引鍵) - 基於其他表中的列約束資料。

  • CHECK 約束 - CHECK 約束確保列中的所有值都滿足某些條件。

  • EXCLUSION 約束 - EXCLUDE 約束確保如果使用指定的運算子在指定的列或表示式上比較任意兩行,則這些比較都不會返回 TRUE。

NOT NULL 約束

預設情況下,列可以儲存 NULL 值。如果您不希望列具有 NULL 值,則需要在此列上定義此類約束,指定該列現在不允許 NULL 值。NOT NULL 約束始終寫為列約束。

NULL 與沒有資料不同;相反,它表示未知資料。

示例

例如,以下 PostgreSQL 語句建立一個名為 COMPANY1 的新表並新增五列,其中三列 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 約束

UNIQUE 約束防止兩條記錄在特定列中具有相同的值。例如,在 COMPANY 表中,您可能希望防止兩個或更多人具有相同的年齡。

示例

例如,以下 PostgreSQL 語句建立一個名為 COMPANY3 的新表並新增五列。這裡,AGE 列設定為 UNIQUE,因此您不能有兩個具有相同年齡的記錄 -

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 約束

PRIMARY KEY 約束唯一標識資料庫表中的每條記錄。可以有多個 UNIQUE 列,但表中只有一個主鍵。設計資料庫表時,主鍵非常重要。主鍵是唯一的 ID。

我們使用它們來引用錶行。在建立表之間的關係時,主鍵成為其他表中的外部索引鍵。由於“長期編碼疏忽”,主鍵可以在 SQLite 中為 NULL。其他資料庫並非如此。

主鍵是表中的一個欄位,它唯一標識資料庫表中的每一行/記錄。主鍵必須包含唯一值。主鍵列不能具有 NULL 值。

一個表只能有一個主鍵,它可以包含一個或多個欄位。當多個欄位用作主鍵時,它們稱為複合鍵

如果表在任何欄位上定義了主鍵,則您不能有兩個記錄具有該欄位的相同值。

示例

您已經在上面的各種示例中看到了我們如何建立帶有 ID 作為主鍵的 COMAPNY4 表 -

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

FOREIGN KEY 約束

外部索引鍵約束指定列(或一組列)中的值必須與另一個表某一行的值匹配。我們說這維護了兩個相關表之間的引用完整性。它們被稱為外部索引鍵,因為約束是外部的;也就是說,在表之外。外部索引鍵有時也稱為引用鍵。

示例

例如,以下 PostgreSQL 語句建立一個名為 COMPANY5 的新表並新增五列。

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

例如,以下 PostgreSQL 語句建立一個名為 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 約束

CHECK 約束允許一個條件來檢查輸入記錄的值。如果條件計算結果為假,則記錄違反約束,不會輸入到表中。

示例

例如,以下 PostgreSQL 語句建立一個名為 COMPANY5 的新表並新增五列。在這裡,我們在 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)
);

EXCLUSION 約束

排除約束確保如果在指定的列或表示式上使用指定的運算子比較任意兩行,則這些運算子比較中的至少一個將返回 false 或 null。

示例

例如,以下 PostgreSQL 語句建立一個名為 COMPANY7 的新表並新增五列。在這裡,我們添加了一個 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 是要構建和用於執行的索引型別。

您需要為每個資料庫執行一次命令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 );

對於前兩個 INSERT 語句,記錄被新增到 COMPANY7 表中。對於第三個 INSERT 語句,將顯示以下錯誤 -

ERROR:  conflicting key value violates exclusion constraint "company7_name_age_excl"
DETAIL:  Key (name, age)=(Paul, 42) conflicts with existing key (name, age)=(Paul, 32).

刪除約束

要刪除約束,您需要知道它的名稱。如果知道名稱,則很容易刪除。否則,您需要找出系統生成的名稱。psql 命令 \d 表名在這裡可以提供幫助。一般語法為 -

ALTER TABLE table_name DROP CONSTRAINT some_name;
廣告

© . All rights reserved.