一 約束的定義
創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)格爾木,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108
約束是強(qiáng)加在表上的規(guī)則或條件。確保數(shù)據(jù)庫(kù)滿足業(yè)務(wù)規(guī)則。保證數(shù)據(jù)的完整性。當(dāng)對(duì)表進(jìn)行DML或DDL操作時(shí),如果此操作會(huì)造成表中的數(shù)據(jù)違反約束條件或規(guī)則的話,系統(tǒng)就會(huì)拒絕執(zhí)行這個(gè)操作。約束可以是列一級(jí)別的 也可以是表級(jí)別的。定義約束時(shí)沒(méi)有給出約束的名字,ORACE系統(tǒng)將為該約束自動(dòng)生成一個(gè)名字,其格式為SYS_Cn,其中n為自然數(shù)(強(qiáng)烈建議各位在創(chuàng)建表或增加約束時(shí),給約束定義名稱。)
在Oracle中,數(shù)據(jù)完整性可以使用約束、觸發(fā)器、應(yīng)用程序(過(guò)程、函數(shù))三種方法來(lái)實(shí)現(xiàn),在這三種方法中,因?yàn)榧s束易于維護(hù),并且具有最好的性能,所以作為維護(hù)數(shù)據(jù)完整性的首選。
列級(jí)約束:
列級(jí)定義是在定義列的同時(shí)定義約束;
column [CONSTRAINT constraint_name] constraint_type
表級(jí)約束:
表級(jí)定義是指在定義了所有列后,再定義約束,這里需要注意,not null約束只能在列級(jí)上定義;
column ,...,
[CONSTRAINT constraint_name] constraint_type (column,...)
二 約束功能
約束的功能:實(shí)現(xiàn)一些業(yè)務(wù)規(guī)則,防止無(wú)效的垃圾數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù),維護(hù)數(shù)據(jù)庫(kù)的完整性(完整性指正確性與一致性)。從而使數(shù)據(jù)庫(kù)的開(kāi)發(fā)和維護(hù)都更加容易。
三 約束的分類
1 not null(非空)
如果在列上定義了not null,那么當(dāng)插入數(shù)據(jù)時(shí),必須為列提供,數(shù)據(jù)不能為NULL。約束只能在列級(jí)定義,不能在表級(jí)定義。
2 unique(唯一)
當(dāng)定義了唯一約束后,該列值是不能重復(fù)的,但是可以為null。
3 primary key(主鍵)
用于唯一的標(biāo)識(shí)表行的數(shù)據(jù),當(dāng)定義主鍵約束后,該列不但不能重復(fù)而且不能為NULL。一張表最多只能有一個(gè)主鍵,但是可以由多個(gè)unique約束。
創(chuàng)建主鍵或唯一約束后,ORACLE會(huì)自動(dòng)創(chuàng)建一個(gè)與約束同名的索引(UNIQUENES為UNIQUE唯一索引)。需要注意的是:每個(gè)表只能有且有一個(gè)主鍵約束。
4 foreign key(外鍵)
用于定義主表和從表之間的關(guān)系,外鍵約束要定義在從表上,主要?jiǎng)t必須具有主鍵約束或是unique約束,當(dāng)定義外鍵約束后,要求外鍵列數(shù)據(jù)必須在主表的主鍵列存在或是為NULL。
用來(lái)維護(hù)從表(Child Table)和主表(Parent Table)之間的引用完整性. 外鍵約束是個(gè)有爭(zhēng)議性的約束,它一方面能夠維護(hù)數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性,數(shù)據(jù)的完整性。防止錯(cuò)誤的垃圾數(shù)據(jù)入庫(kù); 另外一方面它會(huì)增加表插入、更新等SQL性能的額外開(kāi)銷,不少系統(tǒng)里面通過(guò)業(yè)務(wù)邏輯控制來(lái)取消外鍵約束。例如在數(shù)據(jù)倉(cāng)庫(kù)中,就推薦禁用外鍵約束。
5 check
用于強(qiáng)制行數(shù)據(jù)必須滿足的條件,假定在sal列上定義了check約束,并要求sal列值在1000~2000之間,如果不在1000~2000之間就會(huì)提示出錯(cuò)。
四 約束命令規(guī)范
約束名稱建議自己定義一套命名規(guī)則,否則使用系統(tǒng)生成的約束名,很難能把它和對(duì)應(yīng)的表、字段聯(lián)系起來(lái)。
非空約束 NN_表名_列名
唯一約束 UK_表名_列名
主鍵約束 PK_表名
外鍵約束 FK_表名_列名
條件約束 CK_表名_列名
默認(rèn)約束 DF_表名_列名
如果約束名稱超過(guò)32位長(zhǎng)度,建議應(yīng)該縮寫表名,而不應(yīng)用NN_表名_數(shù)字。不過(guò)具體視情況而定,很多時(shí)候 DF_表名_列名 這樣命名,往往超出了32字符。所以有時(shí)候需要縮寫表面或是采用其它規(guī)則。
五 創(chuàng)建約束
1 not null(非空)
創(chuàng)建
SQL> create table t1(id number,name varchar2(20) constraint nn_t1_id not null);
Table created.
SQL> col CONSTRAINT_NAME format A50
SQL> col OWNER format A20
SQL> select constraint_name,constraint_type,owner from user_constraints;
CONSTRAINT_NAME C OWNER
SYS_C009047 V SCOTT
FK_DEPTNO R SCOTT
SYS_C009046 C SCOTT
NN_T1_ID C SCOTT
PK_DEPT P SCOTT
PK_EMP P SCOTT
6 rows selected.
修改
SQL> drop table t1 purge;
Table dropped.
SQL> create table t1(id number,name varchar2(20));
Table created.
SQL> alter table t1 modify id constraint nn_t1_id not null;
Table altered.
SQL> select constraint_name,constraint_type,owner from user_constraints;
CONSTRAINT_NAME C OWNER
FK_DEPTNO R SCOTT
SYS_C009046 C SCOTT
NN_T1_ID C SCOTT
PK_DEPT P SCOTT
PK_EMP P SCOTT
SYS_C009047 V SCOTT
2 unique(唯一)
創(chuàng)建
SQL> drop table t1 purge;
Table dropped.
SQL> create table t1(id number,qq number,constraint un_t1_qq unique(qq));
Table created.
修改
SQL> drop table t1 purge;
Table dropped.
SQL> create table t1(id number,qq number);
Table created.
SQL> alter table t1 add constraint un_t1_qq unique(qq);
Table altered.
3 primary key(主鍵)
創(chuàng)建
SQL> drop table t1 purge;
Table dropped.
SQL> create table t1(id number,qq number,constraint pk_t1_id primary key(id));
Table created.
修改
SQL> drop table t1 purge;
Table dropped.
SQL> create table t1(id number,qq number);
Table created.
SQL> alter table t1 add constraint pk_t1_id primary key(id);
Table altered.
4 foreign key(外鍵)
創(chuàng)建
SQL> create table t2(id number,cc number,constraint fk_t2_id foreign key(id) references t1(id));
Table created.
修改
SQL> drop table t2 purge
2 ;
Table dropped.
SQL> create table t2(id number,cc number);
Table created.
SQL> alter table t2 add constraint pk_t2_id foreign key(id) references t1(id);
Table altered.
當(dāng)定義了外部鍵約束之后,要求外部鍵列的數(shù)據(jù)必須在主表的主鍵列(或惟一列)中存在,或者為NULL,FOREING KEY約束既可以在列級(jí)定義,也可以在表級(jí)定義。
關(guān)鍵字說(shuō)明:
(1) FOREING KEY:該選項(xiàng)用于指定在表級(jí)定義外部鍵約束。當(dāng)在表級(jí)定義外部鍵約束時(shí)必須指定該選項(xiàng),在列級(jí)定義外部鍵約束不需要指定該選項(xiàng)
(2) REFERENCES:該選項(xiàng)用于指定主表名及其主鍵列。當(dāng)定義外部鍵約束時(shí),該選項(xiàng)必須指定.。
(3) 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ù)。
(4) ON DELECT SET NULL:該選項(xiàng)用于指定轉(zhuǎn)換相關(guān)的外部鍵值為NULL,如果在定義外部鍵約束時(shí)指定了該選項(xiàng),那么當(dāng)刪除主表數(shù)據(jù)時(shí)會(huì)將從表外部鍵列的數(shù)據(jù)設(shè)置為NULL。
5 check(檢查性約束)
創(chuàng)建
SQL> create table t3(id number,sal number,constraint ck_t3_sal check(sal between 5000 and 50000));
Table created.
修改
SQL> drop table t3 purge;
Table dropped.
SQL> create table t3(id number,sal number);
六 維護(hù)約束
1 增加約束
(1) 如果增加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必須使用ALTER TABLE語(yǔ)句的ADD子句;
(2) 如果增加NOT NULL約束,那么必須使用ALTER TABLE語(yǔ)句的MODIFY子句,如:
ALTER TABLE table_name ADD [CONSTRAINT constraint_name]
constraint_type (column,...)
ALTER TABLE table_name MODIFY column
[CONSTRAINT constraint_name] NOT NULL;
2 修改約束名
在同一個(gè)方案中,約束名必須惟一,并且約束名也不能與其他對(duì)象同名。當(dāng)用IMPDP工具或者IMP工具導(dǎo)入其他對(duì)象時(shí),如發(fā)現(xiàn)有同名的對(duì)象,將會(huì)出錯(cuò)
語(yǔ)法:
ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name
TO new_constraint_name;
SQL> ALTER TABLE T1 rename constraint pk_t1_id to pk_t1_idnew
2 ;
Table altered.
3 禁止約束
禁止約束指使約束臨時(shí)失效。當(dāng)禁止了約束之后,約束規(guī)則將不再生效。在使用SQL*LOADER或INSERT裝載數(shù)據(jù)之前,為了加快數(shù)據(jù)裝載速度,應(yīng)該首先禁止約束,然后裝載數(shù)據(jù)。
語(yǔ)法:
ALTER TABLE table_name
DISABLE CONSTRAINT constaint_name [CASCAED];--CASCAED用于指定級(jí)聯(lián)禁止從表的外部鍵
SQL> ALTER TABLE T2 DISABLE constraint pk_t2_id;
Table altered.
4 激活約束
語(yǔ)法:
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
SQL> ALTER TABLE T2 enABLE constraint pk_t2_id;
Table altered.
5 刪除約束
當(dāng)刪除特定表的主鍵約束時(shí),如果該表具有相關(guān)的從表,那么在刪除主鍵約束時(shí)必須帶有CASCAED選項(xiàng)
語(yǔ)法:
ALTER TABLE table_name DROP
CONSTRAINT constraint_name |PRIMARY KEY
SQL> ALTER TABLE T3 drop constraint ck_t3_sal;
Table altered.
6 顯示信息
1.USER_CONSTRAINTS
2.USER_CONS_COLUMNS
3.SQL> set line 100
SQL> col CONSTRAINT_NAME format A20
SQL> col table_NAME format A20
SQL> col column_NAME format A20
SQL> select constraint_name,table_name,column_name from user_cons_columns where table_name='T1';
CONSTRAINT_NAME TABLE_NAME COLUMN_NAME
PK_T1_ID T1 ID
Table created.
SQL> alter table t3 add constraint ck_t3_sal check(sal>5000);
Table altered.