1?not null 約束
not null 約束強制列不接受 null 值。not null 約束強制字段始終包含值。這意味著,如果不向字段添加值,就無法插入新記錄或者更新記錄。
GaussDB使用pg_get_tabledef()函數獲取customers表結構,如:
csdn=> set search_path=csdn;
SET
csdn=>
csdn=> select * from pg_get_tabledef('customers');pg_get_tabledef
---------------------------------------------------------------------------SET search_path = csdn; +CREATE TABLE customers ( +id bigint NOT NULL, +name character varying(64), +addr character varying(128), +city character varying(64), +zip integer, +province character varying(64) NOT NULL, +age integer +) +WITH (orientation=row, compression=no, storage_type=USTORE, segment=off);
(1 row)
我們看到customers表的"客戶ID"與"省份"具有not null屬性,如果我們向表添加數據時就會觸發not null約束。
示例:
insert into customers(id,name,addr) values(90,'test not null','布吉吉華54號');
結果:
2 unique 約束
unique 約束唯一標識數據庫表中的每條記錄。unique 和 primary key 約束均為列或列集合提供了唯一性的保證。primary key 約束擁有自動定義的 unique 約束。請注意,每個表可以有多個unique 約束,但是每個表只能有一個 primary key?約束。
示例:我們創建Order表,設置訂單id列為unique屬性
create table if not exists orders
(order_id bigint,cust_id bigint,empoyee_id int,order_date timestamp,ship_id bigint,constraint unq_order_id unique(order_id)
);
結果:
如果我們的寫入orderid有重復值,就會報ERROR:Duplicate key value
注:unique列約束是允許寫入null值的:
insert into orders(order_id,cust_id,empoyee_id,order_date,ship_id) values(null,3,9,'2018-09-21 09:00:00.000',3);
3 primary key 約束
以customers表為例,客戶ID與客戶名稱組合列為主鍵。
create table customers
(id bigint,name varchar2(64),addr varchar2(128),city varchar2(64),zip varchar2(64),province varchar2(64),constraint prikey_id_name primary key(id,name)
);
結果:
寫入數據,如果客戶ID與客戶名稱同時存在2個相同數據時就會報錯。
insert into customers(id,name,addr,city,zip,province) values(1,'張三','北京路27號','上海','200000','上海市');
insert into customers(id,name,addr,city,zip,province) values(1,'李四','南京路12號','杭州','310000','浙江市');
insert into customers(id,name,addr,city,zip,province) values(1,'張三','北京路27號','上海','200000','上海市');
如果為primary key約束,同時任何為primary key字段不允許為null值,這個是與unique約束的區別。以下客戶名稱為空時會報:The null value in column "name"
insert into customers(id,name,addr,city,zip,province) values(1,null,'北京路27號','上海','200000','上海市');
結果:
4?foreign key 約束
一個表中的 foreign key 指向另一個表中的 primary key。讓我們通過一個實例來解釋外鍵。請看下面兩個表:
"customers" 表:? "orders" 表:
請注意:"orders" 表中的 "客戶id" 列指向 "customers" 表中的 "客戶 id" 列。"customers" 表中的 "客戶id" 列是 "customers" 表中的 primary key。"orders" 表中的 "客戶 id" 列是 "orders" 表中的 foreign key。foreign key 約束用于預防破壞表之間連接的行為。foreign key 約束也能防止非法數據插入外鍵列,因為它必須是它指向的那個表中的值之一。
首先:創建客戶表,主鍵為客戶ID
create table customers
(id bigint,name varchar2(64),addr varchar2(128),city varchar2(64),zip varchar2(64),province varchar2(64),constraint prikey_id primary key(id)
);
再次:創建訂單表,外鍵為客戶ID
create table if not exists orders
(order_id bigint,cust_id bigint,empoyee_id int,order_date timestamp,ship_id bigint,constraint unq_order_id unique(order_id),foreign key (cust_id) references customers(id)
);
結果:
當我們向訂單表寫入一條訂單,但是客戶ID不在客戶表的客戶ID時會報錯:ERROR: ?insert or update on table "orders" violates foreign key constraint
示例:
insert into customers(id,name,addr,city,zip,province) values(1,'張三','北京路27號','上海','200000','上海市');
向order表寫入一條訂單記錄,如果客戶ID不再customer表
insert into orders(order_id,cust_id,empoyee_id,order_date,ship_id) values(1,3,9,'2018-09-21 09:00:00.000',3);
由此,我們應知道外鍵的含義了,沒有客戶哪里有訂單呢?必須是先有客戶才有訂單的。
5?default 約束
default 約束用于向列中插入默認值。如果沒有規定其他的值,那么會將默認值添加到所有的新記錄。
以下創建customers表省份為default約束:
alter table customers alter province set default '廣東省';
結果:
寫入時用default關鍵字:
insert into customers(id,name,addr,city,zip,province) values(2,'李四','南京路12號','杭州','310000',default);
結果:
6 check 約束
如果對單個列定義 check 約束,那么該列只允許特定的值。如果對一個表定義 check 約束,那么此約束會基于行中其他列的值在特定的列中對值進行限制。
如:對于客戶來說需要符合法律年齡的中國人,那么年齡要大于或等于18歲,這個條件我們就可以設置check約束:
alter table customers add constraint check_age check(age>=18);
結果:
以上寫入一位李四的客戶年齡為16歲時報:violates check constraint
7??批注
?
以上六種約束是工作中經常使用到的,主要還是用來規范數據,隨著數據量的增多,如果不對表結構加以約束,那么會有越來越多的“臟數據”進入到數據庫,這對業務系統來說是非常不愿意碰到的。所以為了能夠高效的使用數據庫,請從表結構的設計上下更多的功夫.