我是一个新手,我无法将主键作为外键。对我来说,外键是指将两行表连接在一起。因此,使用username
表的user
作为picture
表中的外键是合乎逻辑的。这意味着该行中的图片属于指定的用户。但是,似乎一般做法倾向于使用无意义的数字作为主要ID。此外,外键必须/应该引用主键。如果我不知道主键,但我知道另一个唯一列,在这种情况下username
,如何从另一个MySQL语句中获取主键,或者将外键指向a非主键?
答案 0 :(得分:8)
此外,外键必须/应该引用主键。如果我不知道主键,但是我知道另一个唯一列,在这种情况下是用户名,我将如何从另一个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表的自动递增主键,即使它没有用作引用,因为默认情况下,第一个主索引或唯一索引是表的聚簇索引。主要char字段可能存在INSERT
和UPDATE
语句的性能缺陷 - 但在SELECT
查询中表现更好。
有关使用内容,代理(无意义,自动生成)或自然键以及有关主题的不同观点的讨论,请阅读: surrogate-vs-natural-business-keys
答案 1 :(得分:5)
你使用"无意义的"主键的值是"有意义的"价值观有时会发生变化。
如果用户正在重命名,那么您不需要去更改其他表中的许多行。这就是为什么通常的做法是给他们一个毫无意义的ID(通常是自动递增)。
答案 2 :(得分:1)
如果在开头使用这些列创建了索引,我认为您可以将外键指向任何列(或列)。
尝试执行
CREATE INDEX user_username_idx ON user(username);
然后创建外键应该可以工作。