【问题标题】:Need to create table with two primary keys (SQL)需要创建具有两个主键的表(SQL)
【发布时间】:2017-04-14 15:09:17
【问题描述】:

我需要用 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 和参与者id)作为主键?知道怎么做吗?

谢谢!

【问题讨论】:

  • 我删除了sql-server 标签,因为这个问题是关于mysql。请不要使用不相关的标签。
  • 您正在寻找一个复合键。这是一个可能有帮助的问题:stackoverflow.com/q/5835978/3901060

标签: mysql key


【解决方案1】:

我假设您正在尝试在两个表之间创建 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 记录。

如果您没有创建这些外键约束,则可以在 participantevent 中不存在 id 的表 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;

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

【讨论】:

    【解决方案2】:

    您正在寻找的是复合键,它是由两列或多列组成的键。 因此,您的表由以下内容定义:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 2013-12-13
        • 1970-01-01
        相关资源
        最近更新 更多