自引用表:UNIQUE约束失败(SQL)

时间:2015-07-07 10:40:49

标签: sql database-design sqlite

建筑

我有以下自引用表。每个实体都与1到多个实体有关系。

enter image description here

由于它是1对多的关系,我用表格表示Relation

CREATE TABLE ENTITY (ID TEXT PRIMARY KEY NOT NULL, VALUE TEXT);
CREATE TABLE RELATION (ID_SOURCE TEXT NOT NULL, ID_DESTINATION TEXT NOT NULL, PREDICAT TEXT, PRIMARY KEY(ID_SOURCE, ID_DESTINATION), FOREIGN KEY(ID_SOURCE) REFERENCES ENTITE(ID), FOREIGN KEY(ID_DESTINATION) REFERENCES ENTITE(ID));

问题

当我插入值时,我收到以下错误:

  

UNIQUE约束失败:RELATION_ENTITY.ID,   RELATION_ENTITY.ID_DESTINATION

我知道为什么我会收到此错误。我在表Relation中插入相同的ID但是值不同。实体m.06y3r使用两个不同的值引用实体m.02jvmvm。我该如何解决这个设计错误?

ID_SOURCE    ID_DESTINATION          VALUE
 m.06y3r       m.02jvmvm        adopted_child.adoptive
 m.06y3r       m.02jvmvm        people.person.parents

2 个答案:

答案 0 :(得分:3)

这都是因为在Relation表中你有PRIMARY KEY(ID_SOURCE, ID_DESTINATION)所以这两个值必须创建唯一的集合。如果您将其更改为PRIMARY KEY(ID_SOURCE, ID_DESTINATION, VALUE),那么它应该可以正常工作。

修改

以下评论中提到的解决方案示例:

CREATE TABLE RELATION (
    ID INT NOT NULL,
    ID_SOURCE TEXT NOT NULL,
    ID_DESTINATION TEXT NOT NULL,
    VALUE TEXT,

    PRIMARY KEY(ID), 
    UNIQUE (ID_SOURCE, ID_DESTINATION, VALUE)
    FOREIGN KEY(ID_SOURCE) REFERENCES ENTITE(ID),
    FOREIGN KEY(ID_DESTINATION) REFERENCES ENTITE(ID));

答案 1 :(得分:1)

如果您希望 id_source id_destination 具有重复值的行,您可以使用代理主键(如autonumber int),也许id_relation,连同其他三列的唯一约束或扩展主键以包含值列,以便它 PRIMARY KEY(ID_SOURCE,ID_DESTINATION,VALUE)

如果要在联接中引用此表,使用代理键可能会让您的生活更轻松。