如何在PostgreSQL中的多列上级联删除

时间:2018-04-10 02:57:46

标签: sql postgresql

假设我有一个表 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列后,它也无法正常工作。

我是否采取了错误的方式?或者我的问题有更好的解决方案吗?真的很感激。

1 个答案:

答案 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)对于索引密钥来说很长。