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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20190218]延遲約束問題2.txt
- Vivado使用技巧(32):IO延遲的約束方法
- Android WorkManager工作約束,延遲與查詢工作Android
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- SQL約束SQL
- WebGL之延遲著色Web
- 精盡MyBatis原始碼分析 - SQL執行過程(四)之延遲載入MyBatis原始碼SQL
- 【學習】SQL基礎-014-約束SQL
- SQL教程——常見的約束型別SQL型別
- MySQL之完整性約束MySql
- RabbitMQ延遲訊息的延遲極限是多少?MQ
- SQL Server 資料表程式碼建立約束SQLServer
- 延遲繫結
- MySQL之 從複製延遲問題排查MySql
- Go 泛型之泛型約束Go泛型
- Django模型之欄位與約束Django模型
- Java物件導向系列[v1.0.0][SQL語法之資料庫約束]Java物件SQL資料庫
- 約束
- SQL外來鍵約束的含義及建立SQL
- SQL Server中使用Check約束達到提升效能SQLServer
- 轉化率模型之轉化資料延遲模型
- SQL資料庫開發中的SSIS 延遲驗證方法SQL資料庫
- Javaweb-約束-外來鍵約束JavaWeb
- redis 延遲佇列Redis佇列
- Mybatis延遲查詢MyBatis
- Laravel 延遲佇列Laravel佇列
- 疫情延遲 題解
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- 基於rabbitmq延遲外掛實現分散式延遲任務MQ分散式
- 啟動優化之動態庫延遲載入優化
- SpringCloud 2020.0.4 系列之 Stream 延遲訊息 的實現SpringGCCloud
- 約束CONSTRAINTAI
- 03約束
- MySQL 約束MySql
- 延遲阻塞佇列 DelayQueue佇列
- 延遲繫結與retdlresolve
- 從庫延遲案例分析
- hyperf redis延遲佇列Redis佇列
- 【MySQL】MySQL基礎(SQL語句、約束、資料型別)MySql資料型別