[英]Creating composite foreign key on a primary key
我有一个名为events的表,其中event_id作为主键,表人以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
----------------------
为此,我需要一个复合外键。
我无法决定如何做到这一点。 任何建议或帮助非常感谢!
非常感谢!
您需要将event_id
和person_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)
);
因为您为每列设置了单独的唯一键。 以下是如何强制复合唯一键,
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
);
我玩这个架构来检查你想要做什么:
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约束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.