子表中的外鍵(單列)是否可能引用具有一些重複值的父鍵?外鍵是否總是引用另一個表中的唯一鍵?
回答
按照SQL標準,外鍵必須引用父表或父表的唯一鍵。如果主鍵具有多列,則外鍵必須具有相同的列號和順序。因此,外鍵引用了父表中的唯一行;不能有重複。
回覆您的評論:
如果T.A
是主鍵,然後不,你不能有任何重複。任何主鍵必須是唯一的且非空的。因此,如果子表具有引用父主鍵的外鍵,則它必須匹配非空的唯一值,因此在父表中引用恰好一行。在這種情況下,您不能創建引用多個父行的子行。
您可以創建一個子行,其外鍵列是NULL,在這種情況下,它引用父表中沒有行。
不,這是不可能的。
當您在表上定義外鍵約束時,意味着外表上只有一個對應的鍵。如果在外表上存在多個,那麼這意味着什麼?
維基百科對Foreign key進入這樣的定義:
外鍵是在符合另一個表的候選鍵關係表中的字段
候選鍵是一個表中是唯一的。
感謝您的幫助.. – ratsy 2012-01-03 21:28:29
是的,外鍵可以引用具有重複值的列。
如果主鍵使用非唯一索引並且在創建時未驗證,則會發生這種情況。 (不過,我從來沒有見過像這樣在現實生活中的情況。作爲@Bill Karwin指出,這將是非常混亂的。所以,這可能不是你真正需要擔心的情況。)
--Create a table with two duplicate rows
create table test1(a number);
insert into test1 values(1);
insert into test1 values(1);
commit;
--Create a non-unique index
create index test1_index on test1(a);
--Use the non-unique index for the primary key, do not validate
alter table test1 add constraint test1_pk primary key (a)
using index test1_index novalidate;
--Build another table with a foreign key to TABLE1
create table test2(a number,
constraint test2_fk foreign key (a) references test1(a));
--Inserting a value that refers to the duplicate value still works.
insert into test2 values(1);
commit;
--The foreign key still works:
--ORA-02291: integrity constraint (TEST2_FK) violated - parent key not found
insert into test2 values(2);
--The primary key works as expected, but only for new values:
--ORA-00001: unique constraint (TEST1_PK) violated
insert into test1 values(1);
古奇。在「你爲什麼要這樣做?」的範疇下:-)但是,謝謝你的明確例子! – 2012-01-03 00:12:24
感謝Jonearles上面的例子!....在使用數據庫的情況相同,但是爲什麼&how ..? – ratsy 2012-01-03 21:40:40
對主鍵使用非唯一索引有幾個很好的理由;可延遲約束,更多重建選項(特別是並行性),索引在約束之前存在等。在此查看有關唯一索引與非唯一索引的信息:http://richardfoote.wordpress.com/2008/06/04/primary -keys-and-non-unique-indexes-whats-really-occurrence/ NOVALIDATE有點奇怪。據我所知,使用它沒有優勢,除非你只需要有一些「壞」的數據。這些案件真的應該記錄在案。如果沒有記錄,也許這只是一個錯誤? – 2012-01-04 06:49:29
- 1. 外鍵是否總是引用主鍵?
- 2. 引用了一個外鍵是與父表的另一個關鍵主鍵
- 3. 是否可以將唯一約束設置爲另一個表中的外鍵?
- 4. 外鍵列是否可以引用父表中包含NULL的唯一列?
- 5. MySQL外鍵 - 總是一個好主意?
- 6. 如何檢查每個主鍵值是否被引用爲另一個表中的外鍵
- 7. MySQL的外鍵到另一個外鍵
- 8. 如何更新在另一個表中引用爲外鍵的表的主鍵?
- 9. 對另一個模式中的表的外鍵引用
- 10. 外鍵可以是另一個表的複合主鍵的一部分嗎?
- 11. MySQL:在一個表中引用另一個表的兩個外鍵
- 12. Sql Server唯一鍵也是索引嗎?
- 13. MySQL - 唯一外鍵
- 14. 創建具有引用另一個表的外鍵的表
- 15. 外鍵引用許多表的一個
- 16. 兩個外鍵引用一個表
- 17. PHP array_rand是否返回唯一鍵?
- 18. JPA:一個表的主鍵和另一個表的主鍵和外鍵
- 19. 在Django中最多隻能引用一個外鍵引用一個外鍵
- 20. SQL Server:如何將外鍵引用到鍵名不同的另一個表中
- 21. 添加一個sql表格的唯一約束作爲外鍵引用另一個sql表格
- 22. 外鍵對象是否有唯一的ID值?
- 23. 是否自然加入外鍵名稱的唯一省略號?
- 24. Symfony2 OneToOne關係變成唯一索引還是外鍵?
- 25. 如果這個鍵已經是一個索引,是否值得在一個鍵上分割一個MySQL表?
- 26. NSDictionary中的唯一鍵 - 如何檢查給定的鍵是否是副本?
- 27. 是否指定一個外鍵使其成爲索引?
- 28. 如何使主鍵成爲另一個表中的外鍵?
- 29. 唯一索引或唯一鍵?
- 30. 外鍵列應該是唯一的而不是空的?
謝謝,但是如果我們談論單列外鍵,例如列'a'是在父表T中引用列'A'的子表t中的foriegn鍵,那麼現在在列A可能有任何情況下是不可能的表T中的重複值?這是否意味着外鍵薄霧alays引用另一個表中的主鍵? – ratsy 2012-01-02 22:58:57
@ratsy:外鍵必須始終引用一個或多個聲明爲PRIMARY KEY或UNIQUE的列。 (除非你使用的是MySQL,但是你仍然應該只針對PRIMARY KEY或者UNIQUE列,即使在MySQL中也是如此。 HTML爲「系統沒有強制要求所引用的列是UNIQUE」) – 2012-01-02 23:37:04
@Catcall:是的,但@ratsy標記了這個問題'oracle',所以我沒有提到InnoDB的非標準行爲。即使在使用InnoDB時,我也強烈建議不要引用非唯一的父行,因爲這樣很容易混淆。 – 2012-01-02 23:46:39