位置:首頁 > 數據庫 > PostgreSQL教學 > PostgreSQL約束條件

PostgreSQL約束條件

約束數據表列執行的規則。這些是用來防止無效的數據被輸入到數據庫中..這確保數據庫中的數據的準確性和可靠性。

約束可以是列級或表級。僅適用於表級約束被應用到整個表的列級約束。為列定義的數據類型,本身是一種約束。例如,一列DATE類型的限製列為有效的日期格式。

以下是常用的限製,可在PostgreSQL。

  • NOT NULL Constraint: 確保列不能有NULL值。

  • UNIQUE Constraint: 確保所有列中的值是不同的。

  • PRIMARY Key: 唯一標識數據庫表中的各行/記錄。

  • FOREIGN Key: 約束基於其他表於的列的數據。

  • CHECK Constraint: CHECK約束,確保一列中的所有值滿足一定條件。

  • EXCLUSION Constraint: 排除約束,確保指定的列(S)或表達式(次)使用指定運算(​​次),但並非所有這些比較,如果任意兩行進行比較將返回TRUE。

NOT NULL 約束

默認情況下,列可以保存NULL值。如果不希望一列具有NULL值,那麼需要在此列指定NULL約束定義。 NOT NULL約束總是寫成一列約束。

NULL並不相同,因為冇有數據,而是它代表著未知的數據。

例子:

例如,下麵PostgreSQL的語句創建一個新的表稱為COMPANY1,增加了五列,其中三個ID和姓名和年齡,指定不接受NULL值:

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

UNIQUE 約束

唯一約束防止兩個記錄在一個特定的列具有相同的值。在COMPANY 表中,例如,可能要防止兩個或兩個以上的人具有相同的年齡。

實例:

例如,下麵PostgreSQL的語句創建一個新的表稱為COMPANY3,增加了五列。這裡AGE列設置為唯一性,所以不能有兩個同年齡記錄:

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值。

一個表隻能有一個主鍵,它可以由一個或多個字段。當多個字段作為主鍵,它們被稱為複合鍵。

如果一個表有任何字段上定義一個主鍵,那麼不能有兩個具有相同值該字段的記錄。

實例:

我們已經看到了各種上麵的例子,已經創建了COMAPNY4,ID作為主鍵的表:

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是外鍵引用表的ID字段COMPANY6。 

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

CHECK 約束

檢查約束允許的條件進入創紀錄的檢查值。如果條件值為false,記錄違反了約束,並冇有寫進入到表。

實例:

例如,下麵的PostgreSQL的語句創建一個新的表稱為COMPANY5,增加了五列。在這裡,我們添加了一個檢查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 <>)
);

這裡使用的要點是建立和使用強製執行的索引類型。

需要來執行命令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, 'Allen', 42, 'California', 20000.00 );
對於插入語句,記錄添加到的COMPANY7表中。對於第三個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;