0

我有一个名为 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
----------------------

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

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

非常感谢!

4

3 回答 3

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)
);
于 2013-05-20T14:01:41.313 回答
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
);
于 2013-05-20T14:00:37.750 回答
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 约束。

于 2013-05-20T14:22:56.477 回答