我需要在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)作为主键?任何想法怎么样?
谢谢你!答案 0 :(得分:3)
我假设您正在尝试在两个表之间创建m:n关系,并且eventparticipant
表将用作联结表。
这个新表只有一个主键,包含两列participant_id
和event_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
记录,否则您将无法删除参与者或事件。
如果您没有创建这些外键约束,则可以在eventparticipant
或participant
中不存在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)
);