我是一個新手,我不能把我的頭圍繞主鍵作爲外鍵。對我而言,外鍵意味着將表的兩行連接在一起。因此,在picture
表中使用user
表的username
作爲外鍵是合理的。這意味着該行中的圖片屬於指定的用戶。然而,看來一般慣例傾向於使用無意義的數字作爲主要ID。此外,外鍵必須/應該引用主鍵。如果我不知道主鍵,但是我知道另一個唯一列,在本例中爲username
,我將如何從另一個MySQL語句中獲取主鍵,或者將外鍵指向非主鍵?MySQL非主外鍵
回答
此外,外鍵必須/應該引用主鍵。如果我不知道主鍵,但是我知道另一個唯一列(在這種情況下爲username),我將如何從另一個MySQL語句中獲取主鍵,或者將外鍵指向非主鍵?
是的,如果你有另一種獨特的鍵,你可以有外鍵引用它:
CREATE TABLE user
(userid INT NOT NULL
, username VARCHAR(20) NOT NULL
--- other fields
, PRIMARY KEY (userid)
, UNIQUE KEY (username)
) ENGINE = InnoDB ;
CREATE TABLE picture
(pictureid INT NOT NULL
, username VARCHAR(20)
--- other fields
, PRIMARY KEY (pictureid)
, FOREIGN KEY (username)
REFERENCES user(username)
) ENGINE = InnoDB ;
如果在其他表的外鍵所引用這個唯一鍵(username
),沒有指出有一個毫無意義的ID。您可以放下它並使表格的username
爲PRIMARY KEY
。
(編輯:) 有幾點對InnoDB表具有自動遞增的主鍵,即使它沒有用作參考,因爲第一個主鍵或唯一索引是默認創建的表的集羣索引。對於INSERT
和UPDATE
語句,主char字段可能具有性能缺陷 - 但在SELECT
查詢中執行得更好。
對於討論關於用什麼,替代(無意義的,自動生成的)或自然鍵,以及關於這個問題的不同意見,請閱讀本:surrogate-vs-natural-business-keys
對主鍵使用「無意義」值的原因是「有意義」的值有時會變化的趨勢。
在用戶被重命名的情況下,您不希望去改變其他表中的許多行。這就是爲什麼給他們一個無意義的ID(通常是自動遞增)的習慣做法。
雖然我很欣賞這些信息,可以你可能會添加如何避免使用主ID作爲外鍵? – puk
我想你可以將外鍵指向任何一列(或多列),如果在開始時使用這些列創建索引。
嘗試執行
CREATE INDEX user_username_idx ON user(username);
,然後創建你的外鍵應該工作。
我已經試過這個,但它不起作用,沒有人通過添加索引和引用外鍵來嘗試嗎? – Rajesh
- 1. 非主鍵的外鍵
- 2. 非主鍵列MySQL索引
- 3. MySQL中使用非主鍵
- 4. MySQL主/外鍵大小?
- 5. MySQL 2外鍵到相同的主鍵
- 6. MySQL查詢外鍵引用主鍵
- 7. MySQL - 也使用外鍵作爲主鍵
- 8. Mysql數據庫...主鍵和外鍵
- 9. MySql外鍵主鍵不匹配
- 10. 作爲主鍵錯誤的mysql外鍵
- 11. MySQL在忽略重複的非主鍵
- 12. MYSQL select語句與非唯一主鍵
- 13. 展平mysql中的非主鍵列
- 14. MySQL:非主鍵列上的索引
- 15. MySQL的外鍵與非識別關係
- 16. 使用外鍵和非鍵屬性創建複合主鍵
- 17. 主鍵和外鍵
- 18. 主鍵和外鍵
- 19. 主鍵和外鍵?
- 20. 外鍵和主鍵
- 21. 主鍵VS外鍵
- 22. Mysql的插入與外鍵指主ID
- 23. MySQL外鍵 - 總是一個好主意?
- 24. 除了int以外的MySql主鍵
- 25. 主/外鍵
- 26. yii2 joinwith非主鍵
- 27. FindAsync非主鍵值
- 28. 如何分配的mysql主鍵或外鍵的鍵長?
- 29. 映射外鍵在EF代碼第一非主代理鍵柱
- 30. Django的 - 形式與外鍵是指非主鍵
我有一個虛擬主鍵的唯一原因是因爲大家都說這是個好主意。但是,它會使插入非常乏味,因爲您必須去找到用作外鍵的主鍵。 – puk