完整性約束
完整性約束用於增強數據的完整性,Oracle提供了5種完整性約束:
Check
NOT NULL
Unique
Primary
Foreign key
完整性約束是一種規則,不占用任何數據庫空間。完整性約束存在數據字典中,在執行SQL或PL/SQL期間使用。用戶可以指明約束是啟用的還是禁用的,當約束啟用時,他增強了數據的完整性,否則,則反之,但約束始終存在於數據字典中。
禁用約束,使用ALTER語句
ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;
或
ALTER TABLE policies DISABLE CONSTRAINT chk_gender
如果要重新啟用約束:
ALTER TABLE policies ENABLE CONSTRAINT chk_gender
刪除約束
ALTER TABLE table_name DROP CONSTRAINT constraint_name
或
ALTER TABLE policies DROP CONSTRAINT chk_gender;
Check 約束
在數據列上Check 約束需要 一個特殊的布爾條件或者將數據列設置成TRUE,至少一個數據列的值是NULL,Check約束用於增強表中數據內容的簡單的商業規則。用戶使用Check約束保證數據規則的一致性。Check約束可以涉及該行同屬Check約束的其他數據列但不能涉及其他行或其他表,或調用函數SYSDATE,UID,USER,USERENV。如果用戶的商業規則需要這類的數據檢查,那麼可以使用觸發器。Check約束不保護LOB數據類型的數據列和對象、嵌套表、VARRY、ref等。單一數據列可以有多個Check約束保護,一個Check約束可以保護多個數據列。
創建表的Check約束使用CREATE TABLE語句,更改表的約束使用ALTER TABLE語句。
語法:
CONSTRAINT [constraint_name] CHECK (condition);
Check約束可以被創建或增加為一個表約束,當Check約束保護多個數據列時,必須使用表約束語法。約束名是可選的並且如果這個名字不存在,那麼oracle將產生一個以SYS_開始的唯一的名字。
例:
CREATE TABLE policies
(policy_id NUMBER,
holder_name VARCHAR2(40),
gender VARCHAR2(1) constraint chk_gender CHECK (gender in ('M','F'),
marital_status VARCHAR2(1),
date_of_birth DATE,
constraint chk_marital CHECK (marital_status in('S','M','D','W'))
);
NOT NULL約束
NOT NULL約束應用在單一的數據列上,並且他保護的數據列必須要有數據值。缺省狀況下,ORACLE允許任何列都可以有NULL值。某些商業規則要求某數據列必須要有值,NOT NULL約束將確保該列的所有數據行都有值。
例:
CREATE TABLE policies
(policy_id NUMBER,
holder_name VARCHAR2(40) NOT NULL,
gender VARCHAR2(1),
marital_status VARCHAR2(1),
date_of_birth DATE NOT NULL
);
對於NOT NULL的ALTER TABLE語句與其他約束稍微有點不同。
ALTER TABLE policies MODIFY holder_name NOT NULL