使用deferred constraint 解決“先有蛋還是先有雞的問題”
使用deferred constraint 解決“先有蛋還是先有雞的問題”
SQL> create table chicken( cid number primary key,
2 eid number references egg(id));
eid number references egg(id))
*
ERROR at line 2:
ORA-00942: 表或檢視不存在
SQL> create table egg (eid number primary key,
2 cid number references chicken(cid));
cid number references chicken(cid))
*
ERROR at line 2:
ORA-00942: 表或檢視不存在
透過上述的語句顯然不能建立chicken 表和egg 表,因為他們之間的依存關係。
我們可以透過先建立表,在透過alter table 建立約束。
SQL> create table chicken(cid number primary key,
2 eid number);
Table created.
SQL> create table egg(eid number primary key,
2 cid number);
Table created.
SQL> alter table chicken add constraint chicken_ref_egg
2 foreign key (eid) references egg(eid);
Table altered.
SQL> alter table egg add constraint egg_ref_chicken
2 foreign key (cid) references chicken(cid);
Table altered.
到現在為止,好像一切都是正常的,我們試著插入記錄:
id 為1 的雞,生了2個蛋。這2個蛋是由id 為1 的雞生的。這段話好糾結。。。
SQL> insert into chicken values(1,2);
insert into chicken values(1,2)
*
ERROR at line 1:
ORA-02291: 違反完整約束條件 (HR.CHICKEN_REF_EGG) - 未找到父項關鍵字
SQL> insert into egg values(2,1);
insert into egg values(2,1)
*
ERROR at line 1:
ORA-02291: 違反完整約束條件 (HR.EGG_REF_CHICKEN) - 未找到父項關鍵字
還是因為chicken 表和egg 表的依賴關係的原因導致插入不成功。因為往chicken
表中插入記錄的時候在父表egg 中找不到相應的記錄,往egg 中插入記錄也是一樣的。
SQL> alter table chicken drop constraint chicken_ref_egg;
Table altered.
SQL> alter table egg drop constraint egg_ref_chicken;
Table altered.
SQL> edit
Wrote file afiedt.buf
1 alter table chicken add constraint
2 chicken_ref_egg
3 foreign key(eid) references egg(eid)
4* initially deferred deferrable
SQL> /
Table altered.
SQL> edit
Wrote file afiedt.buf
1 alter table egg add constraint
2 egg_ref_chicken
3 foreign key(cid) references chicken(cid)
4* initially deferred deferrable
SQL> /
Table altered.
使用deferred constraint 把對約束的檢查推遲到事務commit 的時候。
並且同時往chicken 和 egg 表中都插入資料,構成一個事務,最後提交
現在"先有蛋還是先有雞的問題"就解決了。而且改變下面兩條insert 語句的
執行順序結果也是一樣的。充分體現了事務的靈活性。
SQL> insert into chicken values(1,2);
1 row created.
SQL> insert into egg values(2,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from chicken;
CID EID
---------- ----------
1 2
SQL> select * from egg;
EID CID
---------- ----------
2 1
小結:deferred constraint 可以提供更加靈活的事務控制。在有些情況下是非常有用的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26110315/viewspace-723467/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 先有雞還是先有蛋?這是領域驅動設計落地最大的困局
- 先有雞or先有蛋?淺談資料拆分與特徵縮放的順序問題特徵
- 製作遊戲是先有劇本還是先有地圖、場景等內容?遊戲地圖
- JAVA 雞蛋問題Java
- Serverless 2.0,雞蛋還是銀彈?Server
- Java謎題6:雞與蛋-解決方案Java
- rvest爬取雞蛋期貨資料(遇到的問題)
- google經典演算法面試題-雞蛋問題Go演算法面試題
- Java謎題6:雞與蛋Java
- 欲成大器,先有格局——隋廣義先生的人生格局觀
- 【進階5-3期】深入探究 Function & Object 雞蛋問題FunctionObject
- 雞蛋期貨
- 動態規劃法(六)雞蛋掉落問題(一)(egg dropping problem)動態規劃
- jQuery中的Deferred詳解和使用jQuery
- Doris開發手記1:解決蛋疼的MySQL 8.0連線問題MySql
- jQuery中的Deferred-詳解和使用jQuery
- 一篇文章帶你搞定經典面試題之扔雞蛋問題面試題
- 設立門檻的到底是玩家還是製作者? 從成就機制看遊戲中的蛋雞哲學遊戲
- 解決問題:作為剛入行的前端新手,出活重要還是學習重要?前端
- 解決無法使用VI的問題
- 問題 C: 百雞問題
- 百雞問題
- 掃碼領雞蛋聽靠譜的
- 解決Linux(kali)系統安裝vmware tools還是不能拖拽檔案的問題Linux
- 菜譜-韭黃炒雞蛋
- 什麼是 Flink SQL 解決不了的問題?SQL
- MySQL是怎麼解決幻讀問題的?MySql
- 男生更看重女生的身材臉蛋,還是思想?
- 01 Eclipse使用Maven慢的問題解決EclipseMaven
- 使用Nginx來解決跨域的問題Nginx跨域
- 收藏問題是沒人解決嘛
- JSONP的原理是什麼?解決什麼問題?JSON
- Wampserver圖示是橙色的【問題與解決方案】Server
- 【譯】Python 是解決任何問題的完美工具Python
- 使用async/await更好的解決非同步問題AI非同步
- 健康還是工作,這是個問題
- 解決 Unexpectedlexicaldeclarationincaseblock的問題BloC
- 修改java或css後不生效,還是顯示修改之前的樣式,問題已解決JavaCSS
- idea 使用日常問題 使用maven外掛 打包沒問題 但是使用 mvn命令打包失敗的問題解決IdeaMaven