需要创建带有两个主键的表(SQL)

时间:2017-04-14 15:09:17

标签: mysql key

我需要在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的表(event_id和participantid)作为主键?任何想法怎么样?

谢谢你!

3 个答案:

答案 0 :(得分: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记录,否则您将无法删除参与者或事件。

如果您没有创建这些外键约束,则可以在eventparticipantparticipant中不存在ID为event的表中添加记录您还可以删除参与者或事件,并在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;

注意:创建合并表意味着具有非规范化数据。这很糟糕,因为您必须保留相同数据的多个副本。对于活动的每个参与者,您必须再次输入活动名称和日期。这使得难以维护数据并使其保持一致。例如,如果事件日期发生变化,那么您可能会忘记为所有参与者更新它,或者您错误地将其更改为某个地方。

答案 1 :(得分:0)

表格中不能有两个主键。另外,你真的不想把这些表结合起来吗?好的设计会为参与者和活动提供单独的表格。参与者表可能具有包含事件外键的列,或者如果参与者可以具有多个事件,则您将创建另一个表来链接事件和参与者。 IOW,多对多关系。

因此,从设计角度来看,您需要确定参与者是否可以有多个事件。

答案 2 :(得分:0)

您要找的是复合键,它是由两列或更多列组成的键。 因此,您的表定义为:

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