假设我有一个表 user_item ,用于记录用户及其项目关系,如下所示。
create table user_item (
user_id varchar(255),
iterm_id varchar(255),
CONSTRAINT pk_user_item PRIMARY KEY(user_id,iterm_id)
);
| user_id | iterm_id |
|--------- |---------- |
| user123 | item123 |
同时,用户可以将商品分组到标签中,因此我们有另一张表 user_item_tag
| user_id | iterm_id | tag_id |
|--------- |---------- |-------- |
| user123 | item123 | tag123 |
现在的问题是当我为用户删除一个项目时,应该同时从表格 user_item_tag 中删除相对记录,我注意到级联删除可能对我的情况有帮助,但是当我尝试了SQL
create table user_item_tag (
user_id varchar(255),
item_id varchar(255) references user_item (iterm_id) on delete cascade,
tag_id varchar(255),
CONSTRAINT pk_user_item_tag PRIMARY KEY(user_id, item_id, tag_id)
);
提示
错误:没有唯一约束匹配给定引用表的键#34; user_item"
即使我将<{1}}添加到表 user_item_tag 的references user_item (user_id) on delete cascade
列后,它也无法正常工作。
我是否采取了错误的方式?或者我的问题有更好的解决方案吗?真的很感激。
答案 0 :(得分:0)
外键必须指向唯一约束。 PostgreSQL怎么会知道一个条目属于父表中的哪一行呢?
所以你必须写:
CREATE TABLE user_item_tag (
user_id varchar(255),
item_id varchar(255),
tag_id varchar(255),
CONSTRAINT pk_user_item_tag PRIMARY KEY(user_id, item_id, tag_id),
FOREIGN KEY (user_id, item_id)
REFERENCES user_item (user_id, iterm_id) ON DELETE CASCADE
);
旁边的一个评论:varchar(255)
对于索引密钥来说很长。