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;