Oracle 約束詳解

一 約束的定義數據庫

約束是強加在表上的規則或條件。確保數據庫知足業務規則。保證數據的完整性。當對錶進行DML或DDL操做時,若是此操做會形成表中的數據違反約束條件或規則的話,系統就會拒絕執行這個操做。約束能夠是列一級別的 也能夠是表級別的。定義約束時沒有給出約束的名字,ORACE系統將爲該約束自動生成一個名字,其格式爲SYS_Cn,其中n爲天然數(強烈建議各位在建立表或增長約束時,給約束定義名稱。)
在Oracle中,數據完整性可使用約束、觸發器、應用程序(過程、函數)三種方法來實現,在這三種方法中,由於約束易於維護,而且具備最好的性能,因此做爲維護數據完整性的首選。
列級約束:
列級定義是在定義列的同時定義約束;
column [CONSTRAINT constraint_name] constraint_type
表級約束:
表級定義是指在定義了全部列後,再定義約束,這裏須要注意,not null約束只能在列級上定義;
column ,...,
[CONSTRAINT constraint_name] constraint_type (column,...)ide

二 約束功能函數

約束的功能:實現一些業務規則,防止無效的垃圾數據進入數據庫,維護數據庫的完整性(完整性指正確性與一致性)。從而使數據庫的開發和維護都更加容易。工具

三 約束的分類性能

1 not null(非空)
若是在列上定義了not null,那麼當插入數據時,必須爲列提供,數據不能爲NULL。約束只能在列級定義,不能在表級定義。orm

2 unique(惟一)
當定義了惟一約束後,該列值是不能重複的,可是能夠爲null。
3 primary key(主鍵)
用於惟一的標識錶行的數據,當定義主鍵約束後,該列不但不能重複並且不能爲NULL。一張表最多隻能有一個主鍵,可是能夠由多個unique約束。
建立主鍵或惟一約束後,ORACLE會自動建立一個與約束同名的索引(UNIQUENES爲UNIQUE惟一索引)。須要注意的是:每一個表只能有且有一個主鍵約束。
4 foreign key(外鍵)
用於定義主表和從表之間的關係,外鍵約束要定義在從表上,主要則必須具備主鍵約束或是unique約束,當定義外鍵約束後,要求外鍵列數據必須在主表的主鍵列存在或是爲NULL。
用來維護從表(Child Table)和主表(Parent Table)之間的引用完整性. 外鍵約束是個有爭議性的約束,它一方面可以維護數據庫的數據一致性,數據的完整性。防止錯誤的垃圾數據入庫; 另一方面它會增長表插入、更新等SQL性能的額外開銷,很多系統裏面經過業務邏輯控制來取消外鍵約束。例如在數據倉庫中,就推薦禁用外鍵約束。
5 check
用於強制行數據必須知足的條件,假定在sal列上定義了check約束,並要求sal列值在1000~2000之間,若是不在1000~2000之間就會提示出錯。對象

四 約束命令規範索引

約束名稱建議本身定義一套命名規則,不然使用系統生成的約束名,很難能把它和對應的表、字段聯繫起來。
    非空約束     NN_表名_列名
    惟一約束     UK_表名_列名
    主鍵約束     PK_表名
    外鍵約束     FK_表名_列名
    條件約束     CK_表名_列名
    默認約束     DF_表名_列名
若是約束名稱超過32位長度,建議應該縮寫表名,而不該用NN_表名_數字。不過具體視狀況而定,不少時候 DF_表名_列名 這樣命名,每每超出了32字符。因此有時候須要縮寫表面或是採用其它規則。開發

五 建立約束
1 not null(非空)
建立
SQL> create table t1(id number,name varchar2(20) constraint nn_t1_id not null);it

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(惟一)
建立
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(主鍵)
建立
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(外鍵)
建立
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.
當定義了外部鍵約束以後,要求外部鍵列的數據必須在主表的主鍵列(或唯一列)中存在,或者爲NULL,FOREING KEY約束既能夠在列級定義,也能夠在表級定義。

關鍵字說明:
(1) FOREING KEY:該選項用於指定在表級定義外部鍵約束。當在表級定義外部鍵約束時必須指定該選項,在列級定義外部鍵約束不須要指定該選項
(2) REFERENCES:該選項用於指定主表名及其主鍵列。當定義外部鍵約束時,該選項必須指定.。
(3) ON DELETE CASCAED:該選項用於指定級聯刪除選項。若是在定義外部鍵約束時指定了該選項,那麼當刪除主表數據時會級聯刪除從表的相關數據。
(4) ON DELECT SET NULL:該選項用於指定轉換相關的外部鍵值爲NULL,若是在定義外部鍵約束時指定了該選項,那麼當刪除主表數據時會將從表外部鍵列的數據設置爲NULL。
5 check(檢查性約束)
建立
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);
六 維護約束

1 增長約束
(1) 若是增長UNIQUE、PRIMARY KEY、FOREIGN 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;

2 修改約束名
在同一個方案中,約束名必須唯一,而且約束名也不能與其餘對象同名。當用IMPDP工具或者IMP工具導入其餘對象時,如發現有同名的對象,將會出錯
語法:
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 禁止約束

禁止約束指使約束臨時失效。當禁止了約束以後,約束規則將再也不生效。在使用SQL*LOADER或INSERT裝載數據以前,爲了加快數據裝載速度,應該首先禁止約束,而後裝載數據。
語法:
ALTER TABLE table_name
DISABLE CONSTRAINT constaint_name [CASCAED];--CASCAED用於指定級聯禁止從表的外部鍵
SQL> ALTER TABLE T2 DISABLE constraint pk_t2_id;

Table altered.
4 激活約束

語法:
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
SQL> ALTER TABLE T2 enABLE constraint pk_t2_id;

Table altered.
5 刪除約束

當刪除特定表的主鍵約束時,若是該表具備相關的從表,那麼在刪除主鍵約束時必須帶有CASCAED選項
語法:
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.

相關文章
相關標籤/搜索