Oracle 约束 Constraint
約束簡介
約束用于確保數(shù)據(jù)庫數(shù)據(jù)滿足特定的商業(yè)邏輯或者企業(yè)規(guī)則,如果定義了約束,并且數(shù)據(jù)不符
合約束,那么DML操作(INSERT、UPDATE、DELETE)將不能成功執(zhí)行。約束包括NOT NULL、UNIQUE、PRIMARY KEY、FOREING KEY 以及CHECK、DAFAULT等6種類型
定義約束
列級(jí)約束:
column [CONSTRAINT constraint_name] constraint_type
表級(jí)約束:
column ,…,
[CONSTRAINT constraint_name] constraint_type (column,…)
1.定義NOT NULL約束
NOT NULL 約束只能在列級(jí)定義,不能在表級(jí)定義
例:
CREATE TABLE emp01(
eno INT NOT NULL,
name VARCHAR2(10) CONSTRAINT nn_name2 NOT NULL,
salary NUMBER(6,2)
);
上例中,eno列與name列上定義了NOT NULL約束,其中eno列的NOT NULL約束沒有指定約束名,而
name列則指定了約束名nn_name。
可以通過查詢user_constraints字典來查看所定義的約束,如:
SQL> select constraint_name,constraint_type from user_constraints
2 where table_name=‘EMP01’;
CONSTRAINT_NAME CO
SYS_C0010618 C
NN_NAME C
可見,沒有給約束名的,系統(tǒng)將會(huì)自動(dòng)的定義一個(gè)約束名稱,其中約束類型中,P:表示主鍵,R:
表示外鍵,C表示NOT NULL或CHECK,U表示UNIQUE。且系統(tǒng)中同一方案下的的約束名不能重復(fù)
2.定義UNIQUE約束
定義了唯一約束之后,唯一約束列的列值不能重復(fù),但可以為NULL。UNIQUE約束既可以在列級(jí)
定義,也可以在表級(jí)定義
例:
CREATE TABLE emp02(
eno INT UNIQUE,name VARCHAR2(10) CONSTRAINT u_name UNIQUE,
salary NUMBER(6,2)
);
同樣,如果沒有給出約束名,系統(tǒng)會(huì)自動(dòng)定義一個(gè)名稱,可從查詢結(jié)果得出
SQL> select constraint_name,constraint_type from user_constraints
2 where table_name=‘EMP02’;
CONSTRAINT_NAME CO
SYS_C0010623 U
U_NAME
U
3.定義PRIMARY KEY 約束
當(dāng)定義主鍵約束后,主鍵約束列的列值不僅不能重復(fù),而且也不能為NULL。主鍵約束既可以在
列級(jí)定義,也可以在表級(jí)定義。一張表最多只能具有一個(gè)主鍵約束,當(dāng)一個(gè)表中的多個(gè)列都要為
主鍵是,可以在表級(jí)定義。
例1:列級(jí)定義主鍵
CREATE TABLE depto04(
dno INT PRIMARY KEY,
dname VARCHAR2(10),loc VARCHAR2(20)
);
通過查詢user_constraints可得出
SQL> select constraint_name ,constraint_type from user_constraints
2 where table_name=‘DEPT04’;
CONSTRAINT_NAME CO
SYS_C0010625 P
通過查詢user_cons_columns可得出
SQL> select constraint_name,column_name from user_cons_columns
2 where table_name=‘DEPT04’;
CONSTRAINT_NAME COLUMN_NAME
SYS_C0010625 DNO
例2:表級(jí)定義主鍵
CREATE TABLE dept05(
dno INT,
dname VARCHAR2(10),loc VARCHAR2(20),
PRIMARY KEY(dno,dname)
);
通過查詢user_constraints可以得出
SQL> select constraint_name,constraint_type from user_constraints
2 where table_name=‘DEPT05’;
CONSTRAINT_NAME CO
SYS_C0010626 P
通過查詢user_cons_columns可得出
SQL> select constraint_name,column_name from user_cons_columns
2 where table_name=‘DEPT05’;
CONSTRAINT_NAME COLUMN_NAME
SYS_C0010626 DNO
SYS_C0010626 DNAME
可見,當(dāng)在表級(jí)定義時(shí),約束名稱將會(huì)相同,而在user_cons_columns查詢是,每一列將對(duì)應(yīng)約束
名稱相同的兩條記錄
4.定義FOREING KEY約束
當(dāng)定義了外部鍵約束之后,要求外部鍵列的數(shù)據(jù)必須在主表的主鍵列(或惟一列)中存在,或
者為NULL,FOREING KEY約束既可以在列級(jí)定義,也可以在表級(jí)定義。
關(guān)鍵字說明:
FOREING KEY:該選項(xiàng)用于指定在表級(jí)定義外部鍵約束。當(dāng)在表級(jí)定義外部鍵約束時(shí)必須指定該選
項(xiàng),在列級(jí)定義外部鍵約束不需要指定該選項(xiàng)
REFERENCES:該選項(xiàng)用于指定主表名及其主鍵列。當(dāng)定義外部鍵約束時(shí),該選項(xiàng)必須指定。
ON DELETE CASCAED:該選項(xiàng)用于指定級(jí)聯(lián)刪除選項(xiàng)。如果在定義外部鍵約束時(shí)指定了該選項(xiàng),那
么當(dāng)刪除主表數(shù)據(jù)時(shí)會(huì)級(jí)聯(lián)刪除從表的相關(guān)數(shù)據(jù)。
ON DELECT SET NULL:該選項(xiàng)用于指定轉(zhuǎn)換相關(guān)的外部鍵值為NULL,如果在定義外部鍵約束時(shí)指定
了該選項(xiàng),那么當(dāng)刪除主表數(shù)據(jù)時(shí)會(huì)將從表外部鍵列的數(shù)據(jù)設(shè)置為NULL。
例1:列級(jí)定義外鍵約束
CREATE TABLE emp04(
eno INT,name VARCHAR2(10),salary NUMBER(6,2),
dno INT CONSTRAINT fk_dno REFERENCES dept04(dno)
);
SQL> select constraint_name,constraint_type from user_constraints
2 where table_name=‘EMP04’;
CONSTRAINT_NAME CO
FK_DNO R
SQL> select constraint_name,column_name from user_cons_columns
2 where table_name=‘EMP04’;
CONSTRAINT_NAME COLUMN_NAME
FK_DNO DNO
例2:表級(jí)定義外鍵約束
CREATE TABLE emp05(
eno INT,name VARCHAR2(10),salary NUMBER(6,2),
dno INT,
CONSTRAINT fk_dno_name FOREIGN KEY(dno,name) REFERENCES dept05(dno,dname)
);
SQL> select constraint_name,constraint_type from user_constraints
2 where table_name=‘EMP05’
3 ;
CONSTRAINT_NAME CO
FK_DNO_NAME R
SQL> select constraint_name,column_name from user_cons_columns
2 where table_name=‘EMP05’;
CONSTRAINT_NAME COLUMN_NAME
FK_DNO_NAME DNO
FK_DNO_NAME NAME
5.定義CHECK約束
CHECK約束既可以在列級(jí)定義,也可以在表級(jí)定義。CHECK約束允許列為NULL。
例:
CREATE TABLE emp06(
eno INT,name VARCHAR2(10),salary NUMBER(6,2),
CHECK (salary BETWEEN 1000 AND 5000)
);
SQL> select constraint_name,constraint_type from user_constraints
2 where table_name=‘EMP06’;
CONSTRAINT_NAME CO
SYS_C0010629 C
SQL> select constraint_name,column_name from user_cons_columns
2 where table_name=‘EMP06’;
CONSTRAINT_NAME COLUMN_NAME
SYS_C0010629 SALARY
6.定義復(fù)合約束
復(fù)合約束即在表級(jí)定義,基于多列的復(fù)合約束,如:
CREATE TABLE dept05(
dno INT,
dname VARCHAR2(10),loc VARCHAR2(20),
PRIMARY KEY(dno,dname)
);或
CREATE TABLE emp05(
eno INT,name VARCHAR2(10),salary NUMBER(6,2),
dno INT,
CONSTRAINT fk_dno_name FOREIGN KEY(dno,name) REFERENCES dept05(dno,dname)
);
9.3維護(hù)約束
9.3.1增加約束
如果增加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必須使用ALTER TABLE語句的ADD子句;
如果增加NOT NULL約束,那么必須使用ALTER TABLE語句的MODIFY子句,如:
ALTER TABLE table_name ADD [CONSTRAINT constraint_name]
constraint_type (column,…)
ALTER TABLE table_name MODIFY column
[CONSTRAINT constraint_name] NOT NULL;
9.3.2修改約束名
在同一個(gè)方案中,約束名必須惟一,并且約束名也不能與其他對(duì)象同名。當(dāng)鱫IMPDP工具或者IMP
工具導(dǎo)入其他對(duì)象時(shí),如發(fā)現(xiàn)有同名的對(duì)象,將會(huì)出錯(cuò)
語法:
ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name
TO new_constraint_name;
例:
ALTER TABLE emp01 RENAME CONSTRAINT SYS_C005028
TO ck_emp01_salary;
9.3.3 刪除約束
當(dāng)刪除特定表的主鍵約束時(shí),如果該表具有相關(guān)的從表,那么在刪除主鍵約束
時(shí)必須帶有CASCAED選項(xiàng)
語法:
ALTER TABLE table_name DROP
CONSTRAINT constraint_name |PRIMARY KEY
例1
ALTER TABLE emp01 DROP CONSTRAINT ck_emp01_salary;
例2
ALTER TABLE dept01 DROP PRIMARY KEY CASCAED
9.3.4禁止約束
禁止約束指使約束臨時(shí)失效。當(dāng)禁止了約束之后,約束規(guī)則將不再生效。在使用SQL*LOADER或
INSERT裝載數(shù)據(jù)之前,為了加快數(shù)據(jù)裝載速度,應(yīng)該首先禁止約束,然后裝載數(shù)據(jù)。
語法:
ALTER TABLE table_name
DISABLE CONSTRAINT constaint_name [CASCAED];–CASCAED用于指定級(jí)聯(lián)禁止從表的外部鍵
約束
例:
ALTER TABLE emp05 DISABLE CONSTAINT SYS_C00502;
9.3.5 激活約束
語法:
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
例:
ALTER TABLE emp05 ENABLE CONSTRAINT SYS_C005022;
9.4 顯示約束信息
1.USER_CONSTRAINTS
2.USER_CONS_COLUMNS
總結(jié)
以上是生活随笔為你收集整理的Oracle 约束 Constraint的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle DML、DDL、DCL的区
- 下一篇: Oracle session解释