如何在同一个表中引用实体两次但具有不同的变量?

时间:2016-12-23 18:54:45

标签: mysql sql reference

我真的希望我使用了正确的词汇,因为我通常不会用英语这样做。

我的问题如下:我想创建一个表,该表在另一个表中引用同一个实体两次,但具有不同的变量。 详细地说,我想创建一个名为“匹配”的表,它在名为“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”的给定键

2 个答案:

答案 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作为密钥,并查找其他字段所需的信息。