2017-04-14 76 views
0

我需要在SQL中創建一個包含兩個主鍵的表,即時通訊編程新手,真的需要幫助,因此很困惑!需要用兩個主鍵創建表(SQL)

無論如何,這裏是我的表,我有。

mysql> create table participant(
    -> participantid int not null primary key, 
    -> participant_fname varchar(20) not null, 
    -> participant_lname varchar(20) not null); 


    mysql> create table event(
    -> event_id int not null primary key, 
    -> event_name varchar(35) not null, 
    -> event_date int not null); 

所以這些都是我的兩個表,我需要以某種方式將它們合併,並創建一個名爲eventparticipant用(事項標識和participantid)作爲主鍵的表?任何想法怎麼樣?

謝謝!

+0

我刪除'SQL-server'標籤,因爲這問題是關於'mysql'。請不要使用不相關的標籤。 –

+0

您正在查找複合鍵。這裏有一個問題可以幫助:http://stackoverflow.com/q/5835978/3901060 – FamousJameous

回答

3

我假設您正試圖在兩個表格之間創建m:n關係,並且eventparticipant表格將用作聯結表格。

此新表格將只有一個主鍵,由兩列participant_idevent_id組成。請注意,一個表只能有一個主鍵,但這個主鍵可以由多個列組成。這些列的值的每個組合必須是唯一的。

CREATE TABLE eventparticipant(
    participant_id int not null, 
    event_id int not null, 
    PRIMARY KEY (participant_id, event_id) 
); 

ALTER TABLE participant 
ADD CONSTRAINT fk_participant_eventpart 
FOREIGN KEY(participant_id) 
REFERENCES eventparticipant(participant_id) 
ON DELETE CASCADE; 

ALTER TABLE event 
ADD CONSTRAINT fk_event_eventpart 
FOREIGN KEY(event_id) 
REFERENCES eventparticipant(evet_id) 
ON DELETE CASCADE; 

ON DELETE CASCADE子句是可選的。這意味着如果您刪除參與者或事件,那麼兩者之間的連接將自動被刪除。另一方面,如果您不添加此條款,那麼您將無法刪除參與者或事件,除非您首先刪除所有相關的eventparticipant記錄。

如果您沒有創建這些外鍵約束,將有可能與ID在participantevent不存在添加表eventparticipant記錄,你也可以刪除參與者或事件,並在eventparticipant留下幻影記錄後面。


如果你真的想合併這兩個表,不這樣做的身體,而是創建於這三個表合併視圖或只是一個選擇查詢

SELECT 
    p.participant_fname, 
    p.participant_lname, 
    e.event_name, 
    e.event_date 
FROM 
    participants p 
    INNER JOIN eventparticipant ep 
     ON p.participant_id = ep.participant_id 
    INNER JOIN event e 
     ON ep.event_id = e.event_id; 

注意:創建合併表將意味着有非標準化的數據。這很糟糕,因爲您必須保留相同數據的多個副本。對於活動的每個參與者,您都必須再次輸入活動名稱和日期。這使得難以維護數據並保持一致。例如,如果事件日期發生變化,那麼您可能會忘記爲所有參與者更新它,或者您在某處錯誤地輸入了它。

0

表中不能有兩個主鍵。另外,你真的不想把這些表結合起來嗎?好的設計會爲參與者和事件提供單獨的表格。參與者表可能有一個帶有外鍵的列,或者如果參與者可以有多個事件,則可以創建另一個表來鏈接事件和參與者。 IOW,多對多的關係。

因此,從設計的角度來看,您需要確定參與者是否可以有多個事件。

0

你在找什麼是複合鑰匙這是一個由兩列或多列組成的鑰匙。 所以,你的表被定義爲:

create table eventparticipant(
    event_id int not null, 
    participant_id int not null, 
    PRIMARY KEY (participant_id, event_id) 
);