Oracle資料庫中Constraint約束的四對屬性
我們在建立資料庫的時候會建立一些Constraint約束,包括主鍵、外來鍵等。那麼約束它有屬性嗎?答案是肯定的,本文我們就介紹一下Oracle資料庫Constraint約束的四對屬性:Deferrable/not deferrable, Deferred/immediate, enalbe/disable, validate/novalidate,接下來就讓我們來一起了解一下這一過程吧。
1.Deferrable,not deferrable(default value)
1)這對屬性是定義是否可以defer,defer是指作檢查的時機,如果在commit的時check為Defer,否則為immediate .只有在設定Deferrable才可以設定另一個屬性2-- Deferred,immediate.
2)設定defer check的方法有兩種(前提是建立了Deferrable的contraint)
a.通過建contraint時指定Deferred值
b.通過會話級別的語句修改
SET CONSTRAINT(s) contraint_name/all immediate/deferred.
3)這對屬性是在建立的constraint的時候定義的,不能被修改.
4)notice:如果建立了Deferrable的uk或pk,只會建立相應的nonuniquce index,而不會建立uniquce index
2.Deferred,immediate(default value)
1)這對屬性定義是否defer. Deferred: check on commit; immediate: check immediate.
2)If constraint is not deferrable,immediate is only choice.
3) For example:
- CREATE TABLE games
- (scores NUMBER, CONSTRAINT unq_num UNIQUE (scores)
- INITIALLY DEFERRED DEFERRABLE);
- insert into games values(1);
- insert into games values(1);
- commit;--在此報錯
- You will not get a error util you commit it;
- SET CONSTRAINT(s) unq_num immediate;--修改屬性
- insert into games values(2);
- insert into games values(2);--在此報錯
- commit;
- You will get a error when you execute the second sql;
3. novalidate, validate(default value)
1) 這對屬性定義constraint是否對錶中已經存在的資料作檢查,例如:
- create table t(id number);
- insert into t values(1);
- insert into t values(2);
- alter table t add constraint ch_100 check(id>=100); --失敗
- alter table t add constraint ch_100 check(id>=100) novalidate;--成功
2) notice:與唯一索引相關的contraint(例如pk,uk),要做到以上的效果還必須設定為Deferrable(只是建立非唯一性索引),因為在維護索引是,如果違反了唯一性也會報錯,所以必須建立非唯一性索引.例如:
- drop table t;
- create table t(id number);
- insert into t values(1);
- insert into t values(1);
- alter table t add constraint ch_100 unique(id) ; --報錯
- alter table t add constraint ch_100 unique(id) novalidate; --報錯
- alter table t add constraint ch_100 unique(id) deferrable novalidate;--成功
4. disable, enalbe(default value)
1) 啟用和禁用constraint.在新建pk和uk時定義了disable,將不建立相應的索引.
- ALTER TABLE dept DISABLE CONSTRAINT dname_ukey;
- ALTER TABLE dept ENABLE CONSTRAINT dname_ukey;
- alter table t add constraint ch_100 unique(id) disable;
2) DISABLE uk或pk作了些什麼:
Disable非deferrable 的pk、uk,將刪除相應的索引(除非指定了keep index,但是keep下來的索引是唯一性的,insert資料時還是要作唯一性檢查的),在enable時重建索引.
Disbale deferrable 的pk、uk將保留原來的索引(因為原來的索引就是非唯一性的,不影響insert的操作).
3) 一些操作經驗:
KEEP INDEX要注意的:
a.ALTER TABLE games DISAble CONSTRAINT fk_num keep index;--唯一索引被保留,所以還是不能插入重複的資料.不應該keep index.
b.ALTER TABLE games DISAble CONSTRAINT fk_num;--如果上一步被執行,那麼此語句什麼都不做,唯一索引仍被保留,此時應該先enable在disable.如果原來的狀態是able的話,那麼唯一索引將被刪除.
關於Oracle資料庫constraint約束的四對屬性的知識就介紹到這裡了,希望本次的介紹能夠對您有所收穫!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21584437/viewspace-715983/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle約束constraint的三個屬性應用OracleAI
- 10、Oracle中的約 束constraintOracleAI
- Oracle資料庫開發——表(資料完整性約束)Oracle資料庫
- Oracle約束Constraint對於CBO優化器的作用OracleAI優化
- 約束CONSTRAINTAI
- constraint約束AI
- 暑期自學 Day 11 | 資料庫 (四)- 約束資料庫
- 資料庫常用約束資料庫
- mysql資料庫約束MySql資料庫
- oracle中的約束Oracle
- oracle 約束(constraint)的幾個引數的小研究OracleAI
- Oracle SQL細節總結之constraint約束OracleSQLAI
- 資料庫中欄位資料型別以及約束資料庫資料型別
- MySQL——約束(constraint)詳解MySqlAI
- [求助][資料庫]表間約束的刪除完整性?資料庫
- Oracle DG管理資料庫屬性Oracle資料庫
- oracle 資料庫磁碟組屬性Oracle資料庫
- oracle 資料庫磁碟組屬性Oracle資料庫
- 資料庫系統之實體完整性約束資料庫
- 【CONSTRAINT】具有唯一性約束的列是否可以插入空值AI
- [資料庫]資料庫中為什麼不推薦使用外來鍵約束資料庫
- 資料庫約束 主鍵-唯一性-Check-外來鍵資料庫
- 分散式資料庫環境中,外來鍵約束的問題??分散式資料庫
- Oracle約束Oracle
- oracle 約束Oracle
- 資料庫的集合,分頁及約束條件資料庫
- MySQL資料庫:6、約束的概述及語法MySql資料庫
- 如何將資料庫中json格式的列值對映到java物件的屬性中資料庫JSONJava物件
- 資料完整性約束:主鍵、外來鍵、各種約束的建立刪除語句
- (轉)oracle資料庫中所有外來鍵約束失效SQL語句Oracle資料庫SQL
- Oracle約束enable validate時資料檢查Oracle
- oracle impdp的skip_constraint_errors選項跳過唯一約束錯誤OracleAIError
- Oracle唯一約束中NULL的處理OracleNull
- 建約束(Constraint)時隱式建立索引(Index)及先建立索引後建立約束的區別AI索引Index
- Oracle資料庫中對BLOB資料的操作問題Oracle資料庫
- Oracle定義約束 外來鍵約束Oracle
- oracle的延遲約束Oracle
- mysql~資料完整性考慮~外來鍵約束MySql