1.約束類型
NOT NULL----指定列不能包含空值
UNIQUE-----指定列的值或者列的組合的值對於表中所有的行必須是唯一的
PRIMARY KEY----表的每行的唯一性標識
FOREIGN KEY----在列和表引用表的一個列之間建立並強制一個外鍵關係
CHECK----指定一個必須爲真的條件
2.約束原則
1)命名一個約束,必須按照命名規則。如果不命名約束,Oracle服務器將用SYS_Cn格式產生一個名字,這裏n是一個唯一的整數,所以約束名是唯一的。
2)可以在創建表的同時,或者創建表之後創建一個約束
3)在列或者表級定義一個約束
4)在數據字典USER_CONSTRAINTS中查看約束
3.定義約束
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],
...
[table_constraint]);
CREATE TABLE emp(
empno NUMBER(4),
ename VARCHAR2(10),
...
deptno NUMBER(7,2) NOT NULL,
CONSTRAINT emp_empno_pk PRIMARY KEY (empno));
1)列約束級:只能引用一個列,屬於列定義
column [CONSTRAINT constraint_name] constraint_type,
2)表約束級:可引用一個或多個列,屬於表定義,可以定義爲除NOT NULL以外的約束
column,...
[CONSTRAINT constraint_name] constraint_type
(column,...),
3)約束通常在創建表的同時被創建,在表創建後約束能被添加,且約束可被臨時禁用
約束可以在兩個級別上定義:
約束級別 說明
列 只涉及一個單個的列,對該列用規範定義;
能夠定義完整性約束的任何類型
表 涉及一個或多個列,表中的列被分別定義;
除了NOT NULL,能夠定義任何約束
4.NOT NULL約束
-確保某些列不允許空值:
-NOT NULL約束:對該列來說沒有行能夠包含一個空值
-缺少NOT NULL約束:對於該列來說任何行都能包含空值
-NOT NULL約束確保列不包含控制。默認情況下,沒有此約束,可包含空值
例1:在列一級上定義約束
CREATE TABLE emp(
empno NUMBER(4),
ename VARCHAR2(10) NOT NULL,
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(7,2) NOT NULL);
5.UNIQUE約束
-UNIQUE完整性約束要求在表中指定的列或列組合中不能有兩行相同的值。定義UNIQUE約束的列(或列組合)被稱爲唯一鍵(unique key)
-除非我們在相應列上定義了NOT NULL約束,否則UNIQUE約束允許輸入空值
-UNIQUE可以在列級也可以在表級定義
例1:定義在表一級
CREATE TABLE deptment(
deptno NUMBER(2),
dname VARCHAR2(14),
loc VARCHAR2(13),
CONSTRAINT dept_dname_uk UNIQUE(dname));
例2:定義在列一級
CREATE TABLE deptment(
deptno NUMBER(2),
dname VARCHAR2(14) CONSTRAINT dept_dname_uk UNIQUE,
loc VARCHAR2(13));
6.PRIMARY KEY約束
-PRIMARY KEY約束爲表創建一個主鍵
-每個表只能創建一個主鍵
-PRIMARY KEY約束是表中對行唯一標識的一個列或列組合,該約束強制列或列組合的唯一性
-主鍵列不能包含空值
-可定義在表一級或列一級
例1:定義在表一級
CREATE TABLE deptment(
deptno NUMBER(2),
dname VARCHAR2(14),
loc VARCHAR2(13),
CONSTRAINT dept_dname_uk UNIQUE(dname),
CONSTRAINT dept_deptno_pk PRIMARY KEY(deptno));
例2:定義在列一級
CREATE TABLE deptment(
deptno NUMBER(2) CONSTRAINT dept_deptno_pk PRIMARY KEY,
dname VARCHAR2(14),
loc VARCHAR2(13),
CONSTRAINT dept_dname_uk UNIQUE(dname));
7.FOREIGN 約束
-可定義在表或列一級
例:列一級約束:
CREATE TABLE emp(
empno NUMBER(4),
ename VARCHAR2(10) NOT NULL,
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUBMER(7,2),
comm NUMBER(7,2),
deptno NUMBER(7,2) NOT NULL
CONSTRAINT emp_deptno_fk REFERENCES dept(deptno));
-FOREIGN KEY:在表或列約束級別
-REFERENCES:標識父表和父表中列
-ON DELETE CASCADE:當父表中的行被刪除時,刪除子表中相依賴的行
-ON DELETE SET NULL:當父表的值被刪除時,轉換外鍵值爲空
-在無ON DELETE CASCADE或ON DELETE SET NULL選項時,若父表中的行在子表中引用,那麼它不能被刪除
例:ON DELETE CASCADE選項
CREATE TABLE test(
empno NUMBER(4),
ename VARCHAR2(10) NOT NULL,
deptno NUMBER(7,2) NOT NULL
CONSTRAINT emp_deptno_fk
REFERENCES dept(deptno)
ON DELETE CASCADE);
8.CHECK約束
-CHECK約束定義一個每行都必須滿足的條件,該條件可以使用和查詢條件一樣的結構
salary NUMBER(8,2) CONSTRAINT
department_salary_min CHECK(salary>0),
...
-不允許使用下面的表達式:
-引用CURRVAL,NEXTVAL,LEVEL和ROWNUM僞列
-調用SYSDATE,UID,USER和UDERENV函數
-涉及其它行的值
9.改變約束
用ALTER TABLE語句:
-添加或刪除玉樹,但不修改它的結構
-啓用或禁用約束
-用MODIFY子句添加一個NOT NULL約束
1)添加約束
ALTER TABLE table
ADD [CONSTRAINT constraint] type (column);
其中:
table----表的名字
constraint----約束的名字
type----約束的類型
column----受約束影響的列的名字
例1:添加一個約束到emp表,要求薪水大於零
ALTER TABLE emp
ADD CONSTRAINT emp_sal
CHECK (sal>0);
例2:添加一個FOREIGN KEY約束到emp表,指示經理必須已經是emp表中的職員
ALTER TABLE emp
ADD CONSTRAINT emp_mgr_fk
FOREIGN KEY(mgr)
REFERENCES emp (empno);
可以用ALTER TABLE語句的MODIFY子句添加一個NOT NULL約束到一個已經存在的列
例:
ALTER TABLE emp
MODIFY (salary CONSTRAINT emp_salary_nn NOT NULL);
注:只有在表示空的或者每個行的該列都有非空值的情況下,纔可以定義NOT NULL
2)查看約束
-數據字典user_constraints
SELECT table_name,constraint_name,constarint_type,status
FROM user_constraints
WHERE table_name='EMP'; //表名必須大寫
-在constraint_type中,C代表CHECK,P代表PRIMARY KEY,R代表引用完整性,U代表UNIQUE鍵。NOT NULL 在數據字典中被作爲CHECK約束存儲
-可用USER_CONS_COLUMNS數據字典視圖查看與約束相關的列名。該視圖對於由系統指定名字的約束特別有用
SELECT constant_name,column_name
FROM user_cons_columns
WHERE table_name='EMP';
3)禁用約束
語法:
ALTER TABLE teble
DISABLE CONSTRAINT constraint [CASCADE];
其中:
table----表名
constraint----約束名
注:既可以在CREATE TABLE也可以在ALTER TABLE語句中使用DISABLE子句
CASCADE子句禁用想依賴的完整性約束
例:ALTER TABLE test_p
DISABLE CONSTRAINT test_deptno_pk CASCADE;
-執行ALTER TABLE語句的DISABLE子句禁用完整性約束,可以禁用一個約束而不刪除它
-應用CASCADE選項禁用想依賴的完整性約束
-禁用唯一鍵或主鍵會移除唯一性索引
4)啓用約束
語法:
ALTER TABLE table
ENABLE CONSTRAINT constraint;
例:ALTER TABLE test_p
ENABLE CONSTRAINT test_deptno_pk;
-若啓用一個約束, 約束將應用於表中所有數據,所有表中數據都必須適合該約束
-若啓用一個UNIQE鍵或者PRIMARY KEY約束,一個UNIQUE或PRIMARY KEY索引將被自動地創建
-既可以在CREATE TABLE也可以在ALTER TABLE語句中使用ENABLE子句
-啓用一個帶CASCADE選項的被禁用的主鍵約束不會啓用任何依賴於該主鍵的外鍵
5)刪除約束
語法:
ALTER TABLE table
DROP PRIMARY KEY | UNIQUE(column)|
CONSTRAINT constraint [CASCADE];
其中:
table----表名
column----受約束影響的列的名字
constraint----約束的名字
CASCADE選項導致任何與其相依賴的約束也被刪除
例1:從emp表中刪除經理約束
ALTER TABLE emp
DROP CONSTRAINT emp_mgr_fk;
例2:刪除test_p表上的PRIMARY KEY約束,並刪除相關聯的在test_f.deptno列上的FOREIGN KEY約束
ALTER TABLE test_p
DROP PRIMARY KEY CASCADE;
刪除約束步驟:
-從USER_CONSTRAINTS和USER_CONS_COLUMNS數據字典視圖中確定約束的名字
-使用帶DROP子句的ALTER TABLE語句
-DROP子句的CASCADE選項導致任何與其相依賴的約束也被刪除
練習
1.創建test_f表
列名 數據類型 長度 主鍵 空否
id NUMBER 7 YES
name VARCHAR2 25 NOT NULL
CREATE TABLE test_f
(id NUMBER(7),
name VARCHAR2(25) NOT NULL,
CONSTRAINT test_fid_pk PRIMARY KEY(id));
2.創建test_p表
列名 數據類型 長度 主鍵 空否
deptno NUMBER 8 YES
dept_name VARCHAR2 25 NOT NULL
CREATE TABLE test_p
(deptno NUMBER(8),
dept_name VARCHAR2(25) NOT NULL,
CONSTRAINT test_pno_pk PRIMARY KEY(deptno));
3.更改test_f表,增加deptno字段,類型NUMBER,長度8
ALTER TABLE test_f
ADD (deptno NUMBER(8));
4.添加一個外鍵到test_f表的deptno列上,該外鍵參照test_P表的deptno列,將該約束命名爲my_dept_id_fk
ALTER TABLE test_f
ADD CONSTRAINT my_dept_id_fk
FOREIGN KEY(deptno)
REFERENCES test_p(deptno);
5.更改test_f表,增加sal字段,類型爲NUMBER,長度爲7,增加check約束,要求sal>1000
ALTER TABLE test_f
ADD (sal NUMBER(7),
CONSSTRAINT test_fsal_c
CHECK (sal>100));
6.查詢USER_CONSTRAINTS視圖,確認約束已被添加,注意約束類型和名字
SELECT table_name,constraint_name,constraint_type,status
FROM user_constraints
WHERE table_name='TEST_F';
7.禁用test_f表的check約束
ALTER TABLE test_f
DISABLE CONSTRAINT test_fsal_c CASCADE;
8.啓用test_f表的check約束
ALTER TABLE test_f
ENABLE CONSTRAINT test_fsal_c CASCADE;
9.刪除test_f表的check約束
ALTER TABLE test_f
DROP CONSTRAINT test_fsal_c CASCADE;