看下面的例子:
CREATE TABLE temp (age NUMBER(3));
ALTER TABLE temp ADD CONSTRAINT ck_temp_age CHECK
((AGE>0) AND (AGE <= 125));
現(xiàn)在我們能夠插入Age表的集合是{1,2,…,125}或null,這和我們實(shí)際的現(xiàn)實(shí)生活是符合的。
為限制Age字段取值范圍不能為空,增加not null約束。
CREATE TABLE temp (age NUMBER(3) NOT NULL);
ALTER TABLE temp ADD CONSTRAINT ck_temp_age CHECK
((AGE>0) AND (AGE<=125));
下面的操作就會(huì)獲得一個(gè)oracle錯(cuò)誤:
SQL> insert into temp values (130);
insert into temp values (130)
*
ORA-02290: check constraint (SCOTT.CK_TEMP_AGE) violated.
當(dāng)Oracle 執(zhí)行插入操作時(shí),會(huì)檢查Check約束條件表達(dá)式結(jié)果是否為TRUE,不為TRUE則拒絕執(zhí)行。
Check約束可以使用組合條件:
CREATE TABLE temp (a NUMBER);
ALTER TABLE temp ADD CONSTRAINT ck_temp_a CHECK
(((a>=0) AND (a<=10)) OR (a=999) OR (a=9999));
Oracle中沒有Boolean類型,PL/SQL有Boolean類型.為了替代一個(gè)boolean列使用check約束
CREATE TABLE temp(enabled NUMBER(1) NOT NULL);
ALTER TABLE temp ADD CONSTRAINT ck_temp_enabled CHECK
(enabled IN (0, 1));
也可以使用varchar2類型
CREATE TABLE temp(enabled VARCHAR2(1) NOT NULL);
ALTER TABLE temp ADD CONSTRAINT ck_temp_enabled CHECK
(enabled IN ('T', 'F', 't', 'f'));
CREATE TABLE temp(status VARCHAR2(16) NOT NULL);
ALTER TABLE temp ADD CONSTRAINT ck_temp_status CHECK
(status IN
('RECEIVED','APPROVED','WAITING APPROVAL'));
一、多字段約束
Check約束可以是一個(gè)多字段的組合,如下:
CREATE TABLE box
(length NUMBER(2) NOT NULL,
width NUMBER(2) NOT NULL,
height NUMBER(2) NOT NULL);
ALTER TABLE box ADD CONSTRAINT ck_box_volume CHECK
((length*width*height<100) AND
(length > 0) AND (length <= 10) AND
(width > 0) AND (width <= 10) AND
(height > 0) AND (height <= 10));
也可以以不同的名字定義多個(gè)Check約束
ALTER TABLE box ADD CONSTRAINT ck_box_length CHECK
((length > 0) AND (length <= 10));
ALTER TABLE box ADD CONSTRAINT ck_box_width CHECK
((width > 0) AND (width <= 10));
ALTER TABLE box ADD CONSTRAINT ck_box_height CHECK
((height > 0) AND (height <= 10));
ALTER TABLE box ADD CONSTRAINT ck_box_dimension CHECK
((length*width*height<100));
二、補(bǔ)充Unique約束
Check約束可以被用于多行非空約束,即同時(shí)為空或同時(shí)不為空。Unique約束的兩個(gè)字段可能有一個(gè)為null,而另一個(gè)不為null,如果我們不想它出現(xiàn)這種情況,我們就可以用Check約束:
(both columns are NULL) OR (both columns are NOT NULL)
CREATE TABLE temp (pk NUMBER PRIMARY KEY, a NUMBER, b NUMBER);
ALTER TABLE temp
ADD CONSTRAINT uk_temp_a_b UNIQUE (a, b);
ALTER TABLE temp ADD CONSTRAINT ck_temp_a_b
CHECK ((a IS NULL AND b IS NULL) OR
(a IS NOT NULL AND b is NOT NULL));