聲明:以下內容看完文檔僅個人理解,僅供參考,詳見下方參考資料。
約束(constraint)
約束分爲檢查約束(Check Constraints)、非空約束(Not-Null Constraints)、唯一約束(Unique Constraints)、主鍵(Primary Keys)、外鍵(Foreign Keys)、排他約束(Exclusion Constraints)。所有約束都可以成爲命名約束,創建時帶constraint 關鍵字。
檢查約束如:
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0)
);
也可以加命名約束:
CREATE TABLE products (
product_no integer,
name text,
price numeric CONSTRAINT positive_price CHECK (price > 0)
);
列約束與表約束:
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0), # 列約束
discounted_price numeric CHECK (discounted_price > 0), #列約束
CHECK (price > discounted_price) #表約束
);
非空約束:
CREATE TABLE products (
product_no integer NOT NULL,
name text NOT NULL,
price numeric NOT NULL CHECK (price > 0)
);
唯一約束:
#列約束寫法
CREATE TABLE products (
product_no integer UNIQUE,
name text,
price numeric
);
#表約束寫法
CREATE TABLE products (
product_no integer,
name text,
price numeric,
UNIQUE (product_no)
);
主鍵約束
一個主鍵約束表示可以用作表中行的唯一標識符的一個列或者一組列。這要求那些值都是唯一的並且非空。因此,下面的兩個表定義接受相同的數據:
CREATE TABLE products (
product_no integer UNIQUE NOT NULL,
name text,
price numeric
);
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
主鍵也可以包含多於一個列,其語法和唯一約束相似:
CREATE TABLE example (
a integer,
b integer,
c integer,
PRIMARY KEY (a, c)
);
增加一個主鍵將自動在主鍵中列出的列或列組上創建一個唯一B-tree索引。並且會強制這些列被標記爲NOT NULL。
一個表最多隻能有一個主鍵(可以有任意數量的唯一和非空約束,它們可以達到和主鍵幾乎一樣的功能,但只能有一個被標識爲主鍵)。
外鍵
這個在實際生產中應用很少,外鍵得作用裏邊不會出現冗餘數據,有外鍵得表依賴被引用得表,外鍵約束得那一列,必須都是被引用表存在得值,如果不存在,或者對主表操作刪除時,外鍵都會起到級聯刪除或者由於外鍵得作用無法操作。
排他約束
排他約束保證如果將任何兩行的指定列或表達式使用指定操作符進行比較,至少其中一個操作符比較將會返回否或空值。
詳見:http://www.postgres.cn/docs/12/sql-createtable.html#SQL-CREATETABLE-EXCLUDE
參考資料
https://www.postgresql.org/docs/12/ddl-constraints.html
http://www.postgres.cn/docs/12/ddl-constraints.html
http://www.postgres.cn/docs/12/sql-createtable.html#SQL-CREATETABLE-EXCLUDE