SQL之延遲約束
在建立約束的時候,有2種選項 deffered(延遲約束),not deffered(不延遲約束,立即檢驗,這是預設的選項)
例如:
create table A(a int constraint check_a check(a>0),b int check check_b(b>0));
create table A(a int constraint check_a check(a>0) not deferrable,b int constraint check_b check(b>0) not deferrable);
--以上2種定義出來的表都是沒有延遲約束的,也就是說,這是我們平時經常建立的表
--我們往A表插入資料
正常插入
不正常插入會立即報錯
drop table A;
create table A(a int constraint check_a check(a>0) deferrable initially immediate,b int constraint check_b check(b>0) deferrable initially deferred);
對於有延遲約束的表,插入更新資料時,帶有deferrable initially immediate的選項時會立即檢查約束,
帶有deferrable initially deferred的選項時不會立即檢查約束。
當使用commit提交事務時,這是會檢查延遲約束,如果有違反約束的記錄存在,則自動回滾事務
當使用 set contraint check_b immediate,也會檢查延遲約束,但是不會自動回滾事務
延遲約束有什麼用???
1.用於物化檢視
用於每插入一條,或修改資料時並不立即檢查約束,到提交事務時才檢查約束。。。
2.用於更新級聯
對於2個有主外來鍵關係的表,更新時就有個麻煩
比如我有2張表,q1(教師id,姓名name) q2(學生id,姓名,教師id) 其中q2的教師id是一個外來鍵
往q1,q2裡插入一條資料
現在我想更改q1表中老師1的t_id號,但由於外來鍵原因,由於在q2表中已經有了對該id的引用,所以是改不了的
如果老師的id號確實寫錯了,但這2張表用了一段時間了,裡面的資料比較多,該怎麼辦呢?
那麼我們刪除那個外來鍵,重新建立一個延長約束外來鍵
這樣,我們先改q1表的教師id,然後再將q2表中對應的t_id 也改成一樣,最後再提交時就不會違反外來鍵的約束條件了
例如:
create table A(a int constraint check_a check(a>0),b int check check_b(b>0));
create table A(a int constraint check_a check(a>0) not deferrable,b int constraint check_b check(b>0) not deferrable);
--以上2種定義出來的表都是沒有延遲約束的,也就是說,這是我們平時經常建立的表
--我們往A表插入資料
正常插入
不正常插入會立即報錯
drop table A;
create table A(a int constraint check_a check(a>0) deferrable initially immediate,b int constraint check_b check(b>0) deferrable initially deferred);
對於有延遲約束的表,插入更新資料時,帶有deferrable initially immediate的選項時會立即檢查約束,
帶有deferrable initially deferred的選項時不會立即檢查約束。
當使用commit提交事務時,這是會檢查延遲約束,如果有違反約束的記錄存在,則自動回滾事務
當使用 set contraint check_b immediate,也會檢查延遲約束,但是不會自動回滾事務
延遲約束有什麼用???
1.用於物化檢視
用於每插入一條,或修改資料時並不立即檢查約束,到提交事務時才檢查約束。。。
2.用於更新級聯
對於2個有主外來鍵關係的表,更新時就有個麻煩
比如我有2張表,q1(教師id,姓名name) q2(學生id,姓名,教師id) 其中q2的教師id是一個外來鍵
往q1,q2裡插入一條資料
現在我想更改q1表中老師1的t_id號,但由於外來鍵原因,由於在q2表中已經有了對該id的引用,所以是改不了的
如果老師的id號確實寫錯了,但這2張表用了一段時間了,裡面的資料比較多,該怎麼辦呢?
那麼我們刪除那個外來鍵,重新建立一個延長約束外來鍵
這樣,我們先改q1表的教師id,然後再將q2表中對應的t_id 也改成一樣,最後再提交時就不會違反外來鍵的約束條件了
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29227735/viewspace-1064119/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle的延遲約束Oracle
- Android WorkManager工作約束,延遲與查詢工作Android
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- SQL約束SQL
- WebGL之延遲著色Web
- sql: 查詢約束SQL
- zookeeper之watch事件延遲事件
- Oracle SQL細節總結之constraint約束OracleSQLAI
- SQL FOREIGN KEY 約束SQL
- Sql Server系列:鍵和約束SQLServer
- SQL Server唯一約束的使用SQLServer
- 【MySQL】 效能優化之 延遲關聯MySql優化
- RabbitMQ延遲訊息的延遲極限是多少?MQ
- MySQL之完整性約束MySql
- SQL之結束篇SQL
- 延遲釋出
- SQL教程——常見的約束型別SQL型別
- 精盡MyBatis原始碼分析 - SQL執行過程(四)之延遲載入MyBatis原始碼SQL
- MySQL之 從複製延遲問題排查MySql
- 【MySQL】 效能最佳化之 延遲關聯MySql
- SQL Server 2012 AlwaysON 同步延遲時間SQLServer
- Go 泛型之泛型約束Go泛型
- Django模型之欄位與約束Django模型
- SQL Server 資料表程式碼建立約束SQLServer
- SQL的主鍵和外來鍵約束SQL
- Laravel 延遲佇列Laravel佇列
- Mybatis延遲查詢MyBatis
- redis 延遲佇列Redis佇列
- 轉化率模型之轉化資料延遲模型
- java多執行緒之延遲初始化Java執行緒
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- 基於rabbitmq延遲外掛實現分散式延遲任務MQ分散式
- Oracle定義約束 外來鍵約束Oracle
- Oracle約束Oracle
- oracle 約束Oracle
- 綜合約束
- 最優化之無約束優化優化
- SQL外來鍵約束的含義及建立SQL