利用虛擬列實現虛擬刪除的主外來鍵約束
以前寫過一篇文章,描述了當結論不從表中真正刪除,而是利用DELETE_FLAG來表示刪除時,無法再利用Oracle的主鍵鍵進行約束。不過前兩天newkid版主巧妙了利用了11g的虛擬列來解決了這個問題。
這裡給出完整的虛擬列實現的主子表DELETE_FLAG方式的外來鍵約束。
利用11G的虛擬列實現複雜的外來鍵約束:http://www.itpub.net/thread-1322611-1-1.html
無法利用主外來鍵時控制主子表的併發訪問(一):http://yangtingkun.itpub.net/post/468/453295
無法利用主外來鍵時控制主子表的併發訪問(二):http://yangtingkun.itpub.net/post/468/453397
無法利用主外來鍵時控制主子表的併發訪問(三):http://yangtingkun.itpub.net/post/468/453590
看一個簡單的例子:
SQL> CREATE TABLE T_FATHER
2 (ID NUMBER,
3 NAME VARCHAR2(30),
4 DELETE_FLAG VARCHAR2(1));
表已建立。
SQL> CREATE TABLE T_CHILDREN
2 (ID NUMBER,
3 FID NUMBER,
4 F_FLAG AS (CAST (DECODE(DELETE_FLAG, 'Y', NULL, 'N') AS VARCHAR2(1))),
5 DELETE_FLAG VARCHAR2(1));
表已建立。
表中包含了DELETE_FLAG,資料並不會真正的刪除,當刪除資料的時候,將DELETE_FLAG置為Y。顯然普通的主外來鍵無法滿足這種設計的需要,因為將主表的記錄刪除的操作只是修改DELETE_FLAG列,而主表的記錄仍然存在,因此子表新增的記錄仍然可以參考主表已經產生的記錄。
不過利用子表的虛擬列來建立外來鍵越是,可以解決這個問題:
SQL> ALTER TABLE T_FATHER ADD
2 PRIMARY KEY (ID, DELETE_FLAG);
表已更改。
SQL> ALTER TABLE T_CHILDREN ADD
2 FOREIGN KEY (FID, F_FLAG)
3 REFERENCES T_FATHER;
表已更改。
下面測試一下外來鍵是否可以正常運作:
SQL> INSERT INTO T_CHILDREN (ID, FID, DELETE_FLAG) VALUES (1, 1, 'N');
INSERT INTO T_CHILDREN (ID, FID, DELETE_FLAG) VALUES (1, 1, 'N')
*
第 1 行出現錯誤:
ORA-02291: 違反完整約束條件 (TEST.SYS_C0011285) - 未找到父項關鍵字
SQL> INSERT INTO T_FATHER VALUES (1, 'A', 'N');
已建立 1 行。
SQL> INSERT INTO T_CHILDREN (ID, FID, DELETE_FLAG) VALUES (1, 1, 'N');
已建立 1 行。
SQL> INSERT INTO T_CHILDREN (ID, FID, DELETE_FLAG) VALUES (2, 1, 'Y');
已建立 1 行。
SQL> UPDATE T_FATHER
2 SET DELETE_FLAG = 'Y'
3 WHERE ID = 1;
UPDATE T_FATHER
*
第 1 行出現錯誤:
ORA-02292: 違反完整約束條件 (TEST.SYS_C0011285) - 已找到子記錄
SQL> UPDATE T_CHILDREN
2 SET DELETE_FLAG = 'Y'
3 WHERE ID = 1;
已更新 1 行。
SQL> UPDATE T_FATHER
2 SET DELETE_FLAG = 'Y'
3 WHERE ID = 1;
已更新 1 行。
SQL> INSERT INTO T_CHILDREN (ID, FID, DELETE_FLAG) VALUES (3, 1, 'N');
INSERT INTO T_CHILDREN (ID, FID, DELETE_FLAG) VALUES (3, 1, 'N')
*
第 1 行出現錯誤:
ORA-02291: 違反完整約束條件 (TEST.SYS_C0011285) - 未找到父項關鍵字
SQL> INSERT INTO T_CHILDREN (ID, FID, DELETE_FLAG) VALUES (3, 1, 'Y');
已建立 1 行。
SQL> UPDATE T_FATHER
2 SET DELETE_FLAG = 'N'
3 WHERE ID = 1;
已更新 1 行。
SQL> UPDATE T_CHILDREN
2 SET DELETE_FLAG = 'N'
3 WHERE ID = 2;
已更新 1 行。
SQL> COMMIT;
提交完成。
可以看到,利用虛擬列配合主表的DELETE_FLAG建立的聯合主外來鍵,完全滿足這種虛擬刪除的主子表關係,可惜的是,只有11g採用虛擬列的功能,11g以前,必須利用觸發器來構造真實的表列。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-667760/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 批量刪除MSSQL 中主外來鍵約束SQL
- oracle主外來鍵鎖_lock_約束Oracle
- 全面理解虛擬DOM,實現虛擬DOM
- 使用DiskGenius工具來實現物理機遷移虛擬機器,實現虛擬化虛擬機
- Openstack命令列刪除虛擬機器硬體模板flavor命令列虛擬機
- mysql 刪除老是報外來鍵約束MySql
- win10怎麼刪除虛擬記憶體 刪除win10虛擬記憶體的方法Win10記憶體
- Win10系統怎麼刪除虛擬光碟機 win10刪除虛擬光碟機的方法Win10
- MySQL虛擬列MySql
- 【PK】Oracle 10g刪除主鍵約束後無法刪除唯一約束索引問題的模擬與分析Oracle 10g索引
- 虛擬蜜罐:從資訊模擬到實現虛擬蜜罐技術
- Mysql-基本練習(06-唯一約束、外來鍵約束、新增、刪除單列)MySql
- VMware 虛擬機器一鍵去虛擬化工具虛擬機
- 虛擬現實技術
- 如何利用mysql5.7提供的虛擬列來提高查詢效率MySql
- Holofit虛擬現實健身套件 原來虛擬眼鏡還能這麼玩套件
- MySQL5.7 虛擬列實現表示式索引MySql索引
- Openstack的刪除錯誤網橋,虛擬網路除錯
- mysql中外來鍵約束級聯更新與刪除MySql
- 【虛擬化資料恢復】KVM虛擬機器誤刪除資料恢復案例資料恢復虛擬機
- 虛擬函式的實現原理函式
- .Net 虛擬框架的實現原理框架
- 虛擬現實能做什麼?虛擬現實玩遊戲以外還能做很多事遊戲
- 資料完整性約束:主鍵、外來鍵、各種約束的建立刪除語句
- mysql 5.7 虛擬列功能MySql
- 虛擬歌姬列傳
- 【虛擬機器資料恢復】VMware ESXi誤刪除虛擬機器的資料恢復案例虛擬機資料恢復
- 實踐解析:利用ARKit實現直播場景虛擬化(上篇)
- 深入理解 python 虛擬機器:原來虛擬機器是這麼實現閉包的Python虛擬機
- 誤刪除ESXi虛擬機器資料恢復虛擬機資料恢復
- 淺談Oracle 主外來鍵刪除語法格式Oracle
- 【虛擬機器資料恢復】碎片拼接恢復XenServer伺服器被刪除的虛擬機器虛擬機資料恢復Server伺服器
- IaaS關鍵實現技術之網路虛擬化
- 解決資料庫的索引亂碼問題,先刪除外來鍵約束,再刪除主鍵約束及其索引資料庫索引
- 虛擬函式實現原理(轉)函式
- Linux 虛擬滑鼠,鍵盤Linux
- 虛擬鍵碼錶(windows) (轉)Windows
- oracle 11g 虛擬列Oracle