約束的簡介
數(shù)據(jù)的完整性是指數(shù)據(jù)的正確性和一致性,可以通過定義表時定義完整性約束,也可以通過規(guī)則,索引,觸發(fā)器等。約束分為兩類:行級和表級,處理機制是一樣的。行級約束放在列后,表級約束放在表后,多個列共用的約束放在表后。
完整性約束是一種規(guī)則,不占用任何數(shù)據(jù)庫空間。完整性約束存在數(shù)據(jù)字典中,在執(zhí)行SQL或PL/SQL期間使用。用戶可以指明約束是啟用的還是禁用的,當約束啟用時,他增強了數(shù)據(jù)的完整性,否則,則反之,但約束始終存在于數(shù)據(jù)字典中。
約束類型
總的來說有五種:唯一性和主鍵約束、外鍵約束、檢查約束、空值約束、默認值約束,
有五大關(guān)鍵詞,UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT
1。唯一性和主鍵約束。
要求某一列,或幾列不能有重復的值,建立主鍵約束和唯一約束時,Oralce會基于約束列自動建立唯一索引;主鍵約束不允許為NULL,唯一約束允許為NULL,一張表只能建立一個主鍵約束。唯一性和主鍵約束類似,只是關(guān)鍵詞不同而已,語法一致。
創(chuàng)建約束
CREATE TABLE TABLE_NAME
(
COL1 VARCHAR2(32) NOT NULL PRIMARY KEY,
)
CREATE TABLE TABLE_NAME
(
COL1 VARCHAR2(32) NOT NULL CONSTRAINT PK_ID PRIMARY KEY,
)
CREATE TABLE TABLE_NAME
(
COL1 VARCHAR2(32) NOT NULL,
COL2 VARCHAR2(32) NOT NULL Foreign Key,
CONSTRAINT PK_TABLE_NAME PRIMARY KEY(COL1,COL2)
)
修改約束
ALTER TABLE Table_Name
ADD CONSTRAINT PK_Table_Name PRIMARY KEY NONCLUSTERED(Col1)【這里表明了是聚集還是非聚集主鍵索引】
如果唯一性約束保護多個數(shù)據(jù)列,那么唯一性約束要作為表約束增加。語法如下:
CONSTRAINT CONSTRAINT_NAME (COL1,COL2) UNIQUE USING INDEX TABLESPACE (TABLESPACE_NAME) STORAGE (STORED CLAUSE)
2。外鍵約束。
剩下的約束寫法都是差不多,這里就不多舉例了。
CREATE TABLE TABLE_NAME
(
COL1 VARCHAR2(32) NOT NULL REFERENCES PRIMARY_TABLE(PRIMARY_COL) ON DELETE CASCADE,
)
CREATE TABLE TABLE_NAME
(
COL1 VARCHAR2(32) NOT NULL,
CONSTRAINT FK_TABLE_NAME FOREIGN KEY REFERENCES PRIMARY_TABLE(PRIMARY_COL) ON DELETE SET NULL
)
這里需要注意的是ON 后面的內(nèi)容。這個是關(guān)聯(lián)的關(guān)鍵。與刪除修改密切相關(guān)。
3。檢查約束。
檢查列的類型和范圍。語法:CONSTRAINT [constraint_name] CHECK (condition); 比如:check(Age >2)
4??罩导s束、5。默認約束
還有兩種方式,一種是默認值(default sysdate或者 default 1),
一種是限制空值Not Null【NOT NULL只能在列級定義】,
這也可以看成是約束,它的作用也是進行數(shù)據(jù)的完整性控制。
修改默認約束:
ALTER TABLE TABLENAME
ADD CONSTRAINT DF_TABLENAME_COL1 DEFAUIT('22') FOR COL1
修改空值約束
修改NOT NULL是四個約束當中最特殊的,直接用Modify Col_Name NOT NULL 即可
刪除、禁用、啟用約束、修改約束名
ALTER TABLE table_name
DROP CONSTRAINT constraint_name(刪除約束)
DISABLE CONSTRAINT constraint_name;(啟用約束)
ENABLE CONSTRAINT constraint_name;(禁用約束)ALTER TABLE table_name
RENAME CONSTRAINT old_constraint_name TO new_constraint_name(修改約束名)
select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints where constraint_type='R';【禁用所有外鍵約束】
select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints where constraint_type='R';【啟用所有外鍵約束】
select 'alter table '||table_name||' drop constraint '||constraint_name||';' from user_constraints where constraint_type='R';【刪除所有外鍵約束 】
所有約束信息:SELECT * FROM user_constraints