2013-05-20 190 views
0

我有一個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 
---------------------- 

爲此,我需要一個複合外鍵。

我無法決定如何做到這一點。任何建議或幫助非常感謝!

非常感謝!

回答

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

你需要做組合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) 
); 
+0

如何在mysql工作平臺中手動執行此操作 – user475464

+0

我現在沒有可用的Workbench,但是如果我沒有記錯,可以調出屬性表(可能是通過雙擊模式項?),轉到「列「選項卡,然後在」PK「複選框列中的兩個列名旁邊勾選複選框。 –

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約束。