【问题标题】:MySQL non primary foreign keyMySQL非主外键
【发布时间】:2011-11-14 07:57:28
【问题描述】:

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

【问题讨论】:

    标签: mysql foreign-keys primary-key innodb


    【解决方案1】:

    此外,外键必须/应该引用主键。如果我不知道主键,但我知道另一个唯一列,在这种情况下是用户名,我将如何从另一个 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 表有几个点具有自动递增的主键,即使它不用作参考,因为默认情况下第一个主索引或唯一索引是表的聚集索引。对于 INSERTUPDATE 语句,主 char 字段可能存在性能缺陷 - 但在 SELECT 查询中性能更好。


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

    【讨论】:

    • 我有一个虚拟主键的唯一原因是因为每个人都说这是个好主意。但是,它使插入变得非常乏味,因为您必须找到用作外键的主键。
    【解决方案2】:

    您对主键使用“无意义”值的原因是,“有意义”值往往会不时发生变化。

    在用户被重命名的情况下,您不必去更改其他表中的许多行。这就是为什么给他们一个无意义的 ID(通常是自动递增的)是正常做法的原因。

    【讨论】:

    • 虽然我很欣赏这些信息,但您能否补充一下如何使用主 ID 作为外键?
    【解决方案3】:

    我认为你可以让外键指向任何一列(或多列),前提是在开头使用这些列创建了索引。

    尝试执行

    CREATE INDEX user_username_idx ON user(username);
    

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

    【讨论】:

    • 我试过这个,但它不起作用,有没有人尝试通过添加索引和引用作为外键?
    猜你喜欢
    • 2013-08-28
    • 1970-01-01
    • 2016-09-28
    • 2015-10-03
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多