我有以下自引用表。每个实体都与1到多个实体有关系。
由于它是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
答案 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)。
如果要在联接中引用此表,使用代理键可能会让您的生活更轻松。