1. 程式人生 > >oracle的約束的分類建立和修改

oracle的約束的分類建立和修改

三、約束 (一)什麼是約束 Oracle中,資料完整性可以使用約束、觸發器、應用程式(過程、函式)三種方法來實現,在這三種方法中,因為約束易於維護,並且具有最好的效能,所以作為維護資料完整性的首選。 列級約束: 列級定義是在定義列的同時定義約束; column [CONSTRAINT constraint_name] constraint_type 表級約束: 表級定義是指在定義了所有列後,再定義約束,這裡需要注意,not null約束只能在列級上定義; column ,..., [CONSTRAINT constraint_name] constraint_type (column,...)
(二)約束的分類 1  not null(非空) 如果在列上定義了not null,那麼當插入資料時,必須為列提供,資料不能為NULL。約束只能在列級定義,不能在表級定義。 2  unique(唯一) 當定義了唯一約束後,該列值是不能重複的,但是可以為null 3  primary key(主鍵) 用於唯一的標識錶行的資料,當定義主鍵約束後,該列不但不能重複而且不能為NULL。一張表最多隻能有一個主鍵,但是可以由多個unique約束。 建立主鍵或唯一約束後,ORACLE會自動建立一個與約束同名的索引(UNIQUENESUNIQUE唯一索引)。需要注意的是:每個表只能有且有一個主鍵約束。
4  foreign key(外來鍵) 用於定義主表和從表之間的關係,外來鍵約束要定義在從表上,主要則必須具有主鍵約束或是unique約束,當定義外來鍵約束後,要求外來鍵列資料必須在主表的主鍵列存在或是為NULL 用來維護從表(Child Table)和主表(Parent Table)之間的引用完整性外來鍵約束是個有爭議性的約束,它一方面能夠維護資料庫的資料一致性,資料的完整性。防止錯誤的垃圾資料入庫; 另外一方面它會增加表插入、更新等SQL效能的額外開銷,不少系統裡面通過業務邏輯控制來取消外來鍵約束。例如在資料倉庫中,就推薦禁用外來鍵約束。 5  check 用於強制行資料必須滿足的條件,假定在
sal列上定義了check約束,並要求sal列值在10002000之間,如果不在10002000之間就會提示出錯。 (三)約束的建立 1 not null(非空) 方法一: SQL> create table t1(id number,name varchar2(20) constraint nn_t1_id not null); SQL> select constraint_name,constraint_type,owner from user_constraints; CONSTRAINT_NAME        C    OWNER ------------------------------ - ---------- NN_T1_ID                 C    SCOTT 方法二: SQL> drop table t1 purge; SQL> create table t1(id number,name varchar2(20)); SQL> alter table t1 modify id constraint nn_t1_id not null; SQL> select constraint_name,table_name,owner from user_constraints; CONSTRAINT_NAME          TABLE_NAME                   OWNER ------------------------------ ------------------------------ ---------- NN_T1_ID                 T1                             SCOTT 2 unique(唯一) 方法一: SQL> create table t1(id number,qq number,constraint un_t1_qq unique(qq)); 方法二: SQL> alter table t1 add constraint un_t1_qq unique(qq); 3  primary key(主鍵) 方法一: SQL> create table t1(id number,qq number,constraint pk_t1_id primary key(id)); 方法二: SQL> alter table t1 add constraint pk_t1_id primary key(id); SQL> select constraint_name,table_name,owner from user_constraints; CONSTRAINT_NAME          TABLE_NAME                   OWNER ------------------------------ ------------------------------ ---------- PK_T1_ID                    T1                           SCOTT 4  foreign key(外來鍵) 方法一: SQL> create table t2(id number,cc number,constraint fk_t2_id foreign key(id) references t1(id)); 方法二: SQL> alter table t1 add constraint pk_t2_id foreign key(id) references t1(id); SQL> select constraint_name,table_name,owner from user_constraints; CONSTRAINT_NAME          TABLE_NAME                   OWNER ------------------------------ ------------------------------ ---------- PK_T1_ID                 T1                             SCOTT PK_T2_ID                 T1                             SCOTT 當定義了外部鍵約束之後,要求外部鍵列的資料必須在主表的主鍵列(或惟一列)中存在,或者為NULL,FOREING KEY約束既可以在列級定義,也可以在表級定義。 關鍵字說明: (1)  FOREING KEY:該選項用於指定在表級定義外部鍵約束。當在表級定義外部鍵約束時必須指定該選項,在列級定義外部鍵約束不需要指定該選項 (2)  REFERENCES:該選項用於指定主表名及其主鍵列。當定義外部鍵約束時,該選項必須指定。 (3)  ON DELETE CASCAED:該選項用於指定級聯刪除選項。如果在定義外部鍵約束時指定了該選項,那麼當刪除主表資料時會級聯刪除從表的相關資料。 (4)  ON DELECT SET NULL:該選項用於指定轉換相關的外部鍵值為NULL,如果在定義外部鍵約束時指定了該選項,那麼當刪除主表資料時會將從表外部鍵列的資料設定為NULL SQL> create table t1(id number,qq number,constraint pk_t1_id primary key(id)); SQL> create table t2(id number,sal number,constraint fk_t2_id foreign key(id) references t1(id)); SQL> delete t1; ----由於主外來鍵約束,無法刪除主表 delete t1 * ERROR at line 1: ORA-02292: integrity constraint (SYS.FK_T2_ID) violated - child record found SQL> insert into t2 values(2,2); ---由於主外來鍵的約束,無法在外來鍵表插入主鍵中id列沒有的值 insert into t2 values(2,2) * ERROR at line 1: ORA-02291: integrity constraint (SYS.FK_T2_ID) violated - parent key not found SQL> delete t2; 1 row deleted. SQL> rollback; SQL> drop table t2 purge; SQL> create table t2(id number,sal number,constraint fk_t2_id foreign key(id) references t1(id) on delete cascade);  -----外來鍵表新增級聯刪除引數 SQL> delete t1;   ----刪除主鍵表上的資料,級聯刪除外來鍵表上的資料 1 row deleted. SQL> select * from t1; no rows selected SQL> select * from t2; no rows selected 5  check(檢查性約束) 方法一: SQL> create table t3(id number,sal number,constraint ck_t3_sal check(sal between 5000 and 50000)); SQL> select constraint_name,table_name,owner from user_constraints; CONSTRAINT_NAME          TABLE_NAME                   OWNER ------------------------------ ------------------------------                    ---------- CK_T3_SAL                T3                              SCOTT 方法二: SQL> create table t3(id number,sal number); SQL> alter table t3 add constraint ck_t3_sal check(sal>5000); (四)約束的維護 增加約束 1) 如果增加UNIQUEPRIMARY KEYFOREIGN KEY CKECK 必須使用ALTER TABLE語句的ADD子句; 2) 如果增加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; 修改約束名 在同一個方案中,約束名必須惟一,並且約束名也不能與其他物件同名。當用IMPDP工具或者IMP工具匯入其他物件時,如發現有同名的物件,將會出錯 語法: ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name TO new_constraint_name; 例: ALTER TABLE emp01 RENAME CONSTRAINT SYS_C005028 TO ck_emp01_salary; SQL> alter table t1 rename constraint PK_T1_ID to new pk01_t1_id; alter table t1 rename constraint PK_T1_ID to new pk01_t1_id * ERROR at line 1:  --------主鍵無法更改名字 ORA-23290: This operation may not be combined with any other operation SQL> alter table t2 rename constraint fk_t2_id to fk01_t2_id; SQL> select constraint_name,table_name from user_constraints where table_name='T2'; CONSTRAINT_NAME                TABLE_NAME ------------------------------ ------------------------------ FK01_T2_ID                     T2   -------------外來鍵可以更改名字 SQL> alter table t1 add constraint un_t1_qq unique(qq); SQL> select constraint_name,table_name from user_constraints where table_name='T1'; CONSTRAINT_NAME                TABLE_NAME ------------------------------ ------------------------------ PK_T1_ID                       T1 UN_T1_QQ                       T1 SQL> alter table t1 rename constraint un_t1_qq to un01_t1_qq; SQL> select constraint_name,table_name from user_constraints where table_name='T1'; CONSTRAINT_NAME                TABLE_NAME ------------------------------ ------------------------------ PK_T1_ID                       T1 UN01_T1_QQ                     T1 禁止約束 禁止約束指使約束臨時失效。當禁止了約束之後,約束規則將不再生效。在使用SQL*LOADERINSERT裝載資料之前,為了加快資料裝載速度,應該首先禁止約束,然後裝載資料。 語法: ALTER TABLE table_name DISABLE CONSTRAINT constaint_name [CASCAED];--CASCAED用於指定級聯禁止從表的外部鍵 SQL> insert into t2 values(2,2); insert into t2 values(2,2) * ERROR at line 1: ORA-02291: integrity constraint (SYS.FK01_T2_ID) violated - parent key not found SQL> alter table t2 disable constraint fk01_t2_id; Table altered. SQL> insert into t2 values(2,2); 1 row created. 啟用約束 語法: ALTER TABLE table_name ENABLE CONSTRAINT constraint_name; 例: SQL> alter table t2 enable constraint fk01_t2_id; alter table t2 enable constraint fk01_t2_id                                  * ERROR at line 1:   ---外來鍵啟用失敗,原因是在外來鍵表中含有主鍵表中沒有的資料 ORA-02298: cannot validate (SYS.FK01_T2_ID) - parent keys not found SQL> delete t2 where id=2;   -------刪除資料 SQL> alter table t2 enable constraint fk01_t2_id;  ----啟用成功 刪除約束 當刪除特定表的主鍵約束時,如果該表具有相關的從表,那麼在刪除主鍵約束時必須帶有CASCAED選項 語法: ALTER TABLE table_name DROP CONSTRAINT constraint_name |PRIMARY KEY 例一:(刪除唯一性約束) SQL> select constraint_name,table_name from user_constraints where table_name='T1'; CONSTRAINT_NAME                TABLE_NAME ------------------------------ ------------------------------ PK_T1_ID                       T1 UN01_T1_QQ                     T1 SQL> alter table t1 drop constraint un01_t1_qq; Table altered. SQL> select constraint_name,table_name from user_constraints where table_name='T1'; CONSTRAINT_NAME                TABLE_NAME ------------------------------ ------------------------------ PK_T1_ID                       T1 例二:(刪除主鍵約束,級聯刪除外來鍵約束) SQL> alter table t1 drop primary key cascade; Table altered. SQL> select constraint_name,table_name from user_constraints where table_name='T2'; no rows selected SQL> select constraint_name,table_name from user_constraints where table_name='T1'; no rows selected 顯示資訊 1.USER_CONSTRAINTS 2.USER_CONS_COLUMNS SQL> select constraint_name,table_name,column_name from user_cons_columns where table_name='T1'; CONSTRAINT_NAME             TABLE_NAME                     COLUM ------------------------------       ------------------------------                   ----- UN_T1_ID                          T1                           ID