自引用 table:唯一约束失败 (SQL)
Self Referencing table : UNIQUE constraint failed (SQL)
建筑
我有以下自引用 table。每个实体都与 1 到多个实体有关系。
表格
因为它是一对多关系,所以我用 table.
表示 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 constraint failed: RELATION_ENTITY.ID,
RELATION_ENTITY.ID_DESTINATION
我知道为什么会出现此错误。我在 table 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
这都是因为在 Relation
table 中你有 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));
如果您想要 id_source 和 id_destination 具有重复值的行,您可以使用代理项主键(如自动编号 int),可能 id_relation
,以及其他三个列的唯一约束,或者扩展主键以也包含值列,这样它将是 PRIMARY KEY( ID_SOURCE, ID_DESTINATION, VALUE).
如果您想在联接中引用此 table,使用代理键可能会让您的生活更轻松。
建筑
我有以下自引用 table。每个实体都与 1 到多个实体有关系。
表格
因为它是一对多关系,所以我用 table.
表示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 constraint failed: RELATION_ENTITY.ID, RELATION_ENTITY.ID_DESTINATION
我知道为什么会出现此错误。我在 table 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
这都是因为在 Relation
table 中你有 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));
如果您想要 id_source 和 id_destination 具有重复值的行,您可以使用代理项主键(如自动编号 int),可能 id_relation
,以及其他三个列的唯一约束,或者扩展主键以也包含值列,这样它将是 PRIMARY KEY( ID_SOURCE, ID_DESTINATION, VALUE).
如果您想在联接中引用此 table,使用代理键可能会让您的生活更轻松。