軟件測試數據庫中Oracle數據庫的完整性約束規則詳解

發表于:2010-07-07來源:作者:點擊數: 標簽:軟件測試數據庫oracleORACLEOracle
軟件測試 數據庫 中 Oracle 數據庫的完整性約束規則詳解 完整性約束用于增強數據的完整性,Oracle提供了5種完整性約束: Check NOT NULL Unique Primary Foreign key 完整性約束是一種規則,不占用任何數據庫空間。完整性約束存在數據字典中,在執行 SQL 或P

軟件測試數據庫Oracle數據庫的完整性約束規則詳解

完整性約束用于增強數據的完整性,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

唯一性約束(Unique constraint)

唯一性約束可以保護表中多個數據列,保證在保護的數據列中任何兩行的數據都不相同。唯一性約束與表一起創建,在唯一性約束創建后,可以使用ALTER TABLE語句修改。語法:

column_name data_type CONSTRAINT constraint_name UNIQUE

如果唯一性約束保護多個數據列,那么唯一性約束要作為表約束增加。語法如下:

CONSTRAINT constraint_name (column)
UNIQUE USING INDEX TABLESPACE
(tablespace_name) STORAGE (stored clause)

唯一性約束由一個B-tree索引增強,所以可以在USING子串中為索引使用特殊特征,比如表空間或存儲參數。CREATE TABLE語句在創建唯一性約束的同時也給目標數據列建立了一個唯一的索引。

CREATE TABLE insured_autos
(policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,
vin VARCHAR2(10),
coverage_begin DATE,
coverage_term NUMBER,
CONSTRAIN unique_auto UNIQUE (policy_id,vin) USING
INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)
);

用戶可以禁用未以性約束,但他仍然存在,禁用唯一性約束使用ALTER TABLE 語句。

ALTER TABLE insured_autos DISABLE CONSTRAIN unique_name;

刪除唯一性約束,使用ALTER TABLE....DROP CONSTRAIN語句:

ALTER TABLE insured_autos DROP CONSTRAIN unique_name;

注意用戶不能刪除在有外部鍵指向的表的唯一性約束。這種情況下用戶必須首先禁用或刪除外部鍵(foreign key)。刪除或禁用唯一性約束通常同時刪除相關聯的唯一索引,因而降低了數據庫性能。經常刪除或禁用唯一性約束有可能導致丟失索引帶來的性能錯誤。要避免這樣錯誤,可以采取下面的步驟:

1、在唯一性約束保護的數據列上創建非唯一性索引。

2、添加唯一性約束。

主鍵(Primary Key)約束

表有唯一的主鍵約束。表的主鍵可以保護一個或多個列,主鍵約束可與NOT NULL約束共同作用于每一數據列。NOT NULL約束和唯一性約束的組合將保證主鍵唯一地標識每一行。像唯一性約束一樣,主鍵由B-tree索引增強。創建主鍵約束使用CREATE TABLE語句與表一起創建,如果表已經創建了,可以使用ALTER TABLE語句。

CREATE TABLE policies
(policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,
holder_name VARCHAR2(40),
gender VARCHAR2(1),
marital_status VARCHAR2(1),
date_of_birth DATE
);

與唯一性約束一樣,如果主鍵約束保護多個數據列,那么必須作為一個表約束創建。

CREATE TABLE insured_autos
(policy_id NUMBER,
vin VARCHAR2(40),
coverage_begin DATE,
coverage_term NUMBER,
CONSTRAINT pk_insured_autos PRIMARY KEY (policy_id,vin)
USING INDEX TABLESPACE index
STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)
);

禁用或刪除主鍵必須與ALTER TABLE 語句一起使用:

ALTER TABLE policies DROP PRIMARY KEY;

ALTER TABLE policies DISABLE PRIMARY KEY;

外部鍵約束(Foreign key constraint)

外部鍵約束保護一個或多個數據列,保證每個數據行的數據包含一個或多個null值,或者在保護的數據列上同時擁有主鍵約束或唯一性約束。引用(主鍵或唯一性約束)約束可以保護同一個表,也可以保護不同的表。與主鍵和唯一性約束不同外部鍵不會隱式建立一個B-tree索引。在處理外部鍵時,我們常常使用術語父表(parent table)和子表(child table),父表表示被引用主鍵或唯一性約束的表,子表表示引用主鍵和唯一性約束的表。創建外部鍵使用CREATE TABLE語句,如果表已經建立了,那么使用ALTER TABLE語句。

CREATE TABLE insured_autos
(policy_id NUMBER CONSTRAINT policy_fk
REFERENCE policies(policy_id
ON DELETE CASCADE,
vin VARCHAR2(40),
coverage_begin DATE,
coverage_term NUMBER,
make VARCHAR2(30),
model VARCHAR(30),
year NUMBER,
CONSTRAIN auto_fk FROEIGN KEY (make,model,year)
REFERENCES automobiles (make,model,year)
ON DELETE SET NULL
);

ON DELETE子串告訴ORACLE如果父紀錄(parent record)被刪除后,子記錄做什么。缺省情況下禁止在子記錄還存在的情況下刪除父紀錄。

外部鍵和NULL值

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97