PostgreSQL的約束
約束類型:檢查約束、非空約束、唯一約束、主鍵、外鍵
1. 檢查約束
設置某個字段裏的數值必須滿足約束表達式的條件。
例:限制人的年齡在0~120之間,語句如下:
create table person(name varchar(40),age int check (age >=0 and age<=120));
insert into person values(‘name1‘,120);
insert into person values(‘name1‘,121);
執行結果如下,年齡字段超過120報錯,提示受“person_age_check”的限制。
指定約束的名稱,需要使用關鍵詞“
create table person(name varchar(40),age int constraint age_chk check (age >=0 and age<=120));
一個檢查約束可以引用多個列,例如:存儲商品平常價格和打折價格,而打折價格低於平常價格,示例如下
create table products (
product_no integer,
name text,
price numeric check (price > 0),
dazhe_price numeric check (dazhe_price > 0),
constraint dazhe_price_chk check (price >dazhe_price)
);
在上面的例子中,針對價格(price > 0)和打折後價格(dazhe_price > 0)的約束稱為列約束,這兩個約束依附於特定的列,但第三個約束(price >dazhe_price)獨立於任何一個列定義,稱為表約束。
執行結果如下:
註:oracle下,檢查約束可以禁用,但在PostgreSQL下卻不可以禁用。
2. 非空約束
非空約束僅僅指定一個列中不會有空值。非空約束等價於檢查約束(column_name is not null
create table products (
product_no integer,
name text,
price numeric not null,
dazhe_price numeric check (dazhe_price > 0),
constraint dazhe_price_chk check (price >dazhe_price)
);
3. 唯一約束
唯一約束保證在一列或一組列中保存的數據是唯一值,示例如下:
create table products (
product_no integer UNIQUE,
name text,
price numeric
);
為一組列定義一個唯一約束,示例如下:
create table products (
product_no integer,
name text,
price numeric,
UNIQUE(product_no, price)
);
為唯一約束指定名稱:
create table products (
product_no integer CONSTRAINT pro_no_unique UNIQUE,
name text,
price numeric
);
PostgreSQL的約束