我真的希望我使用了正确的词汇,因为我通常不会用英语这样做。
我的问题如下:我想创建一个表,该表在另一个表中引用同一个实体两次,但具有不同的变量。 详细地说,我想创建一个名为“匹配”的表,它在名为“club”的表中引用两次实体“name”,因为体育比赛显然有两个团队参与。这就是我试图做的事情:
CREATE TABLE aclub (
clubname varchar(100),
stadium varchar(100),
foundingdate integer,
PRIMARY KEY (clubname, stadium) ) ;
CREATE TABLE amatches (
matchnr integer PRIMARY KEY,
place varchar(100) REFERENCES aclub(stadium),
clubname1 varchar(100) REFERENCES aclub(clubname),
clubname2 varchar(100) REFERENCES aclub(clubname) ) ;
我得到的错误如下:
错误:没有唯一约束匹配引用表“aclub”的给定键
答案 0 :(得分:2)
CREATE TABLE aclub (
id INT AUTO_INCREMENT PRIMARY KEY,
clubname varchar(100),
stadium varchar(100),
foundingdate integer,
UNIQUE (clubname),
UNIQUE (stadium)
) ;
CREATE TABLE amatches (
matchnr INTEGER AUTO_INCREMENT PRIMARY KEY,
club1 INTEGER REFERENCES aclub(id),
club2 INTEGER REFERENCES aclub(id),
place INTEGER REFERENCES aclub(id)
) ;
所以你在问题中有三个对aclub表的引用。但是现在我们使用整数而不是varchar来减少冗余
答案 1 :(得分:1)
使用合成主键。这确实使设计和使用数据模型变得更加容易:
CREATE TABLE aclub (
aclubId int auto_increment PRIMARY KEY,
clubname varchar(100),
stadium varchar(100),
foundingdate integer,
UNIQUE (clubname, stadium)
) ;
CREATE TABLE amatches (
matchnr integer auto_increment PRIMARY KEY,
aclubid integer,
foreign key (aclubid) references aclub(aclubid)
) ;
您的具体问题是所有主键中的列需要包含在外键定义中。但为什么要这么麻烦?只需使用自动递增的ID作为密钥,并查找其他字段所需的信息。