[20160704]NULL與主外來鍵問題.txt
[20160704]NULL與主外來鍵問題.txt
--主外來鍵的問題主要出現在阻塞等情況,有許多極端dba認為應該取消這個約束.當然從使用的角度出發有總比沒有好.只是不要過度濫用.
--我這裡遇到一個問題,開發指出主外來鍵"失效",我仔細檢查發現建立的主表索引是唯一,而非主鍵,這樣可以插入NULL,導致所謂的"失效".
--我開始意味是因為oracle索引不記錄NULL而導致的(主鍵僅僅一個欄位).實際上我的測試還是有點意外:
1.環境:
SCOTT@book> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
--drop table cheap purge;
--drop table pheap purge;
create table pheap (
id number(10) ,
v varchar2(10)
);
create unique index pk_pheap on scott.pheap (id,v);
alter table pheap add constraint uk_pheap unique (id,v);
create table cheap (
id number(10) primary key,
p_id number(10) ,
v varchar2(10)
);
alter table cheap add constraint fk_cheap foreign key (p_id,v) references pheap (id,v);
--//注意如果前面沒有alter table pheap add constraint uk_pheap unique (id,v);
--//SCOTT@book> alter table cheap add constraint fk_cheap foreign key (p_id,v) references pheap (id,v);
--//alter table cheap add constraint fk_cheap foreign key (p_id,v) references pheap (id,v)
--// *
--//ERROR at line 1:
--//ORA-02270: no matching unique or primary key for this column-list
SCOTT@book> @ &r/desc pheap;
Name Null? Type
----- -------- ----------------------------
ID NUMBER(10)
V VARCHAR2(10)
SCOTT@book> @ &r/desc cheap;
Name Null? Type
------ -------- ----------------------------
ID NOT NULL NUMBER(10)
P_ID NUMBER(10)
V VARCHAR2(10)
--都是NULL.
insert into pheap values (1, '1');
insert into pheap values (2, '2');
insert into cheap values (1, 1, '1');
commit;
create index cheappid on cheap (p_id,v);
2.測試:
SCOTT@book> select * from pheap;
ID V
---------- ----------
1 1
2 2
SCOTT@book> select * from cheap;
ID P_ID V
---------- ---------- ----------
1 1 1
SCOTT@book> insert into cheap values (2, 2, NULL);
1 row created.
--//可以發現我插入insert into cheap values (2, 2, NULL);在phead並不存在(2,NULL)的記錄.
SCOTT@book> insert into cheap values (3, 3, NULL);
1 row created.
--//一樣ok.
SCOTT@book> insert into cheap values (4, null, 'a');
1 row created.
SCOTT@book> commit ;
Commit complete.
SCOTT@book> select * from pheap;
ID V
--- ----------
1 1
2 2
SCOTT@book> select * from cheap;
ID P_ID V
--- ---------- ----------
1 1 1
2 2
3 3
4 a
--如果插入:
SCOTT@book> insert into cheap values (4, 5, '5');
insert into cheap values (4, 5, '5')
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.SYS_C0012621) violated
SCOTT@book> delete from pheap where id=2;
1 row deleted.
SCOTT@book> commit ;
Commit complete.
SCOTT@book> insert into pheap values (2, NULL);
1 row created.
SCOTT@book> commit ;
Commit complete.
SCOTT@book> delete from pheap where id=2;
1 row deleted.
--完全不會影響cheap的記錄.
SCOTT@book> rollback;
Rollback complete.
SCOTT@book> delete from pheap where id=1;
delete from pheap where id=1
*
ERROR at line 1:
ORA-02292: integrity constraint (SCOTT.FK_CHEAP) violated - child record found
--當然我的測試非常特殊,主表沒有建立主鍵索引.從另外一個側面索引資料庫設計非常重要.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2121426/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20121020]主外來鍵約束以及NULL問題.txtNull
- 主外來鍵關聯刪除(on delete set null和on delete cascade)deleteNull
- [20121028]not in與NULL問題.txtNull
- 求主外來鍵的關係
- 檢視主外來鍵關係
- mysql主外來鍵依賴關係MySql
- 資料庫的主外來鍵關係資料庫
- oracle 主外來鍵關係及實驗Oracle
- oracle主外來鍵鎖_lock_約束Oracle
- Oracle 查詢表與表之間的 主外來鍵關係Oracle
- EntityFramework Core 遷移忽略主外來鍵關係Framework
- 批量刪除MSSQL 中主外來鍵約束SQL
- sql 查詢 主外來鍵的 一點心得SQL
- 淺談Oracle 主外來鍵刪除語法格式Oracle
- 求主外來鍵的關係的指令碼(ZT)指令碼
- 【問題處理】“NOT IN”與“NULL”的邂逅Null
- MySQL建立資料表並建立主外來鍵關係MySql
- ORACLE查詢表之間的主外來鍵關係Oracle
- 生產庫故障分析(主外來鍵和DML效能分析)
- [20121028]IOT的第2索引-NULL的問題.txt索引Null
- [20150727]''與NULL.txtNull
- class.getResource null問題Null
- [20160704]從跟蹤檔案抽取sql語句.txtSQL
- MYSQL timestamp NOT NULL插入NULL的報錯問題MySqlNull
- [20170516]nvl與非NULL約束.txtNull
- MySQL 檢視資料庫中有主外來鍵關係的表資訊MySql資料庫
- 利用虛擬列實現虛擬刪除的主外來鍵約束
- 關於主外來鍵關係DML父表和DML子表加鎖方式
- 關於主外來鍵表資料提交過程中的一點疑惑
- 為什麼在資料倉儲中很少使用主外來鍵約束
- sql中的安全問題nullSQLNull
- Oracle外來鍵約束中NULL的處理OracleNull
- Oracle 外來鍵索引影響阻塞問題Oracle索引
- not null與check is not nullNull
- Hibernate-select new Object(Entity obj)非主外來鍵關聯物件查詢Object物件
- 第19章405頁: NOT NULL問題Null
- [20170516]nvl與非NULL約束2.txtNull
- indexedDB 內鍵與外來鍵Index