簡體   English   中英

主鍵或唯一列上的 SQL 外鍵

[英]SQL foreign key on primary key or unique column

假設我有兩個表,表 A 和表 B,並且表 A 具有以下列:

COLUMNS (id INT PRIMARY KEY, name VARCHAR(200) UNIQUE)

我想在表 B 中創建一列,它使用外鍵引用表 A 的一行。 大多數情況下,當我在表 BI 中查找一行時,還需要檢索它引用的表 A 行中的名稱字段。 查找(但不是插入)的速度是一個問題。

是用A表的主鍵做外鍵,然后用JOIN把name字段的值帶進來,還是用name字段做外鍵,這樣數據就更好了?在表 B 中查找行時已經存在?

通常名稱可以更改。 也許有人找到了更好的名字,或者名字中有一個必須更正的錯字。 而PK永遠不應該改變。 始終將 ID 用作 FK。 這就是查找表的工作方式。

如果您使用標識列作為 PK,則 ID 將自動生成且無法更改。 進行無意義的PK通常是個好主意。 有意義的列往往是編輯的主題。

最好使用表 A 的主鍵作為外鍵,然后使用 JOIN 引入 name 字段的值,否則只需將所有內容放在表 B 中

在您的示例中,“名稱”是一個可為空的列,因此它不是候選鍵。 外鍵約束應該引用候選鍵(例如,在這種情況下為“Id”)。 我建議您更改表以使“名稱”不可為空或改為引用 Id。

SQL 中可空的 UNIQUE 和 FOREIGN KEY 約束在不同的數據庫產品中可以以不同的方式實現。 它們的含義有時是模棱兩可的,使用它們的結果往往是矛盾的,可能與現實不符。

(可能允許空值只是您 CREATE TABLE 語句中的一個疏忽 - 在這種情況下,我建議您修改問題)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM