在主键上创建复合外键

时间:2013-05-20 13:57:27

标签: php mysql mysqli

我有一个名为events的表,其中event_id为主键,table_ person为主键。

我希望有一个包含两列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
----------------------

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

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

非常感谢!

3 个答案:

答案 0 :(得分:2)

您需要将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)
);

答案 1 :(得分:0)

因为您为每列设置了单独的唯一键。以下是如何强制执行复合唯一键

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
);

答案 2 :(得分:0)

我使用此架构来检查您要执行的操作:

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约束。那是个错误。如果要确保临时表的每个都是唯一的,则需要添加复合主键或JW建议使用复合UNIQUE约束。