我有一个名为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
----------------------
为此,我需要一个复合外键。
我无法决定如何做到这一点。任何建议或帮助都非常感谢!
非常感谢!
答案 0 :(得分:2)
您需要将event_id
和person_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约束。