【问题标题】:how to make a composite foreign key (not composite primary key) as unique in mysql如何使复合外键(不是复合主键)在 mysql 中唯一
【发布时间】:2018-07-29 00:35:36
【问题描述】:

我有一个表,在该表中我有一个主键和一个复合外键(2 个外键的组合)。 我想知道如何将复合外键创建为唯一的,这意味着我不希望该复合外键在表中再次重复?

这是它的查询

create table official_baby_toys(
official_baby_toys_id int,
baby_id int,
toy_id int,
toy_size_id,
primary key(official_baby_toys_id)
foreign key(baby_id,toy_id) references baby_toy(baby_id,toy_id),
foreign key(toy_size_id) references toy_size(toy_size_id),
)

【问题讨论】:

    标签: php mysql database database-design foreign-keys


    【解决方案1】:

    首先创建两个单独的外键,然后创建具有两个字段的 UNIQUE KEY:

    create table official_baby_toys(
    official_baby_toys_id int,
    baby_id int,
    toy_id int,
    toy_size_id,
    primary key(official_baby_toys_id)
    foreign key(baby_id) references baby_toy(baby_id),
    foreign key(toy_id) references baby_toy(toy_id),
    foreign key(toy_size_id) references toy_size(toy_size_id),
    unique key(baby_id, toy_id)
    )
    

    我也不知道您的数据库架构,但我觉得 baby_id 实际上应该引用 baby(baby_id) 而不是 baby_toy(baby_id)。

    编辑: 也可以创建复合外键,但需要先为这两个字段创建索引(或主键,也会创建索引):

    CREATE TABLE baby_toy (
      # other field defs
      baby_id int,
      toy_id int,
      primary key(baby_id, toy_id)
      # OR index(baby_id, toy_id)
    );
    

    那么在official_baby_toys你应该可以创建复合外键了。

    【讨论】:

    • 你不能用复合外键创建一个唯一键吗?不创建两个单独的外键?
    • 这也是一个好习惯吗?我的意思是在表中有一个复合外键。
    • 你可以创建一个复合外键,但据我记得你需要用INDEX (baby_id, toy_id)在你的baby_toy表上创建一个索引,然后使用FOREIGN KEY (baby_id, toy_id) REFERENCES baby_toy(baby_id, toy_id),然后如果你想要这个要独一无二,最好在 baby_toy 表上创建唯一键。
    • 我确实提供了一个创建索引的示例。可以参考官方文档:dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html,“Examples of Foreign Key Clauses”一节——第二个例子定义了一个复合外键。您不需要创建两个外键,这只是其中一种方式。我会更新我的答案。
    • 摆脱primary key(official_baby_toys_id);取而代之的是primary key(baby_id, toy_id)。
    猜你喜欢
    • 2023-04-06
    • 2012-01-27
    • 2016-07-04
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2017-08-06
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多