puk*_*puk 5 mysql innodb foreign-keys primary-key
我是一个新手,我不能把主键作为外键.对我来说,外键是指将两行表连接在一起.因此,例如,username将user表用作表中的外键是合乎逻辑的picture.这意味着该行中的图片属于指定的用户.但是,似乎一般做法倾向于使用无意义的数字作为主要ID.此外,外键必须/应该引用主键.如果我不知道主键,但是我知道另一个唯一的列,在这种情况下username,如何从另一个MySQL语句中获取主键,或者将外键指向非主键,该怎么办?
此外,外键必须/应该引用主键.如果我不知道主键,但是我知道另一个唯一的列,在这种情况下是用户名,我将如何从另一个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 ;
Run Code Online (Sandbox Code Playgroud)
如果其他表中的所有外键都引用了这个唯一键(username),那么拥有无意义的id是没有意义的.你可以删除它,使username该PRIMARY KEY表.
(编辑:)有一些点具有InnoDB表的自动递增主键,即使它没有用作引用,因为默认情况下第一个主索引或唯一索引是表的聚簇索引.主char字段可能具有性能缺陷INSERT和UPDATE语句 - 但在SELECT查询中表现更好.
有关使用什么,代理(无意义,自动生成)或自然键以及关于主题的不同观点的讨论,请阅读:surrogate-vs-natural-business-keys
您对主键使用"无意义"值的原因是"有意义"值有时会发生变化.
在重命名用户的情况下,您不希望在其他表中更改许多行.这就是为什么通常的做法是给他们一个无意义的ID(通常是自动递增).