繁体   English   中英

在主键上创建复合外键

[英]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_idperson_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM