0

主キーとして event_id を持つ events というテーブルと、主キーとして person_id を持つテーブル person があります。

上記の 2 つの主キーへの外部キーとして event_id と person_id の 2 つの列を含むテーブルが必要です。

次のような外部キーを作成できます。

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_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)
);
于 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 に答える