我创造了一张这样的桌子:

CREATE TABLE festival
(
    title text,
    place text,
    sdate date,
    edate date,
    PRIMARY KEY (title)
);

现在,我想创建另一个表,使用节日表中的“title”和“edate”。
CREATE TABLE event
(
    title text,
    edate date,
    etime time,
    FOREIGN KEY (title, edate) REFERENCES festival (title, edate),
    PRIMARY KEY (title, edate, etime)
);

我发现一个错误:
对于引用的表“festival”,没有与给定键匹配的唯一约束
如果我只尝试将标题作为外键传递,那么它就可以工作,但是,如果我只尝试将edate作为外键传递,那么它就失败了(这意味着问题出于某种原因出现在“edate”中)。
为什么会这样?

最佳答案

外键关系应该链接到另一个表的主键。因此,在定义中不应该有edate

FOREIGN KEY (title) REFERENCES festival (title),

如果两个表应该是相同的,则没有理由在这两个表中重复edate。把它放在festival中,然后用join查找它。
我也建议你把节日改成:
CREATE TABLE festival (
    festivalId serial primary key,
    title text unique,
    place text,
    sdate date,
    edate date
);

也就是说,引入一个可用于外键关系的合成密钥。声明title是唯一的。然后使用festivalId表中的events获取标题和日期。
注意:这假设festival上的主键应该只在title上。如果它在(title, edate)上,基本上相同的逻辑成立。实际上,只需引入festivalId并使用它来查找有关festival的所有信息。

关于sql - 尝试传递date类型的FOREIGN KEY会引发错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40359495/

10-10 03:52