【问题标题】:Creating composite foreign key on a primary key在主键上创建复合外键
【发布时间】:2013-05-20 13:57:26
【问题描述】:

我有一个名为 events 的表,以 event_id 作为主键,还有一个名为 person 的表,以 person_id 作为主键。

我想要一个表,其中包含两列 event_id 和 person_id 作为上述两个主键的外键。

我可以创建一个类似这样的外键:

create table pe(
event_id INTEGER UNSIGNED UNIQUE,
person_id INTEGER UNSIGNED UNIQUE,
FOREIGN KEY (event_id) REFERENCES events(event_id),
FOREIGN KEY (person_id) REFERENCES person(person_id)
);

但我无法插入如下值:

----------------------
event_id person_id
----------------------
1 1
1 2
2 1
2 2
----------------------

为此,我需要一个复合外键。

我无法决定如何做到这一点。非常感谢任何建议或帮助!

非常感谢!

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

    您需要使event_idperson_id组合 唯一。我只是将组合设为主键,如下所示:

    create table pe(
      event_id INTEGER UNSIGNED,
      person_id INTEGER UNSIGNED,
      FOREIGN KEY (event_id) REFERENCES events(event_id),
      FOREIGN KEY (person_id) REFERENCES person(person_id),
      PRIMARY KEY (event_id, person_id)
    );
    

    【讨论】:

    • 我现在没有可用的 Workbench,但如果我没记错的话,你会调出属性表(可能是通过双击模式项?),转到“列”选项卡,然后在“PK”复选框列中的两个列名旁边打勾。
    【解决方案2】:

    因为您为每列设置了单独的唯一键。以下是强制复合唯一键的方法,

    create table pe
    (
        event_id INTEGER UNSIGNED,
        person_id INTEGER UNSIGNED,
        FOREIGN KEY (event_id) REFERENCES events(event_id),
        FOREIGN KEY (person_id) REFERENCES person(person_id),
        UNIQUE (event_id, person_id) // <<== or it could be PRIMARY KEY
    );
    

    【讨论】:

      【解决方案3】:

      我玩弄了这个架构来检查你想要做什么:

      CREATE TABLE `events` (
        `event_id` int(11) NOT NULL AUTO_INCREMENT,
        `event_name` varchar(255) NOT NULL,
        PRIMARY KEY (`event_id`),
        UNIQUE KEY `event_name_UNIQUE` (`event_name`)
      ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
      
      CREATE TABLE `person` (
        `person_id` int(11) NOT NULL AUTO_INCREMENT,
        `person_name` varchar(225) DEFAULT NULL,
        PRIMARY KEY (`person_id`)
      ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
      
      CREATE TABLE `pe` (
        `event_id` int(11) NOT NULL,
        `person_id` int(11) NOT NULL,
        PRIMARY KEY (`event_id`,`person_id`),
        KEY `fk_events_has_person_person1` (`person_id`),
        KEY `fk_events_has_person_events` (`event_id`),
        CONSTRAINT `fk_events_has_person_events` FOREIGN KEY (`event_id`) REFERENCES      `events` (`event_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
        CONSTRAINT `fk_events_has_person_person1` FOREIGN KEY (`person_id`) REFERENCES `person` (`person_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8
      

      我认为您的困惑在于您将 UNIQUE 属性放在哪里。每个事件和每个人都必须是独一无二的。这是由各个表中的主键保证的,您还可以在例如 person_name 之类的列中添加 UNIQUE 约束,以确保实际值是唯一的。您的外键没有问题;问题是您向临时表的每个字段添加了 UNIQUE 约束。这是一个错误。如果要确保临时表的每个 row 都是唯一的,则需要添加复合主键或 JW 建议的复合 UNIQUE 约束。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        • 1970-01-01
        • 2021-04-10
        • 2013-06-29
        • 1970-01-01
        相关资源
        最近更新 更多