MySQL非主外键

时间:2011-11-14 07:57:28

标签: mysql foreign-keys primary-key innodb

我是一个新手,我无法将主键作为外键。对我来说,外键是指将两行表连接在一起。因此,使用username表的user作为picture表中的外键是合乎逻辑的。这意味着该行中的图片属于指定的用户。但是,似乎一般做法倾向于使用无意义的数字作为主要ID。此外,外键必须/应该引用主键。如果我不知道主键,但我知道另一个唯一列,在这种情况下username,如何从另一个MySQL语句中获取主键,或者将外键指向a非主键?

3 个答案:

答案 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字段可能存在INSERTUPDATE语句的性能缺陷 - 但在SELECT查询中表现更好。


有关使用内容,代理(无意义,自动生成)或自然键以及有关主题的不同观点的讨论,请阅读: surrogate-vs-natural-business-keys

答案 1 :(得分:5)

你使用"无意义的"主键的值是"有意义的"价值观有时会发生变化。

如果用户正在重命名,那么您不需要去更改其他表中的许多行。这就是为什么通常的做法是给他们一个毫无意义的ID(通常是自动递增)。

答案 2 :(得分:1)

如果在开头使用这些列创建了索引,我认为您可以将外键指向任何列(或列)。

尝试执行

CREATE INDEX user_username_idx ON user(username);

然后创建外键应该可以工作。