在postgresql中没有外键的ON UPDATE CASCADE

时间:2012-10-25 20:18:24

标签: postgresql sql-update cascade

我有一些表需要在postgresql中级联更新,但我认为我不能使用外键来执行此操作。

简单版本是我有4个对象表和2个绑定表:

Table X    Table A       Table A-B      Table B      Table B-C    Table C
-------    --------      ---------      -------      ---------    -------
x_id         a_id           x_id          b_id          x_id        c_id
...          ...            a_id          ...           b_id        ...
...          ...            b_id          ...           c_id        ...
                            ...                         ...

在我的搭售表上,我在所有id字段(x_id,a_id,b_id),(x_id,b_id,c_id)上都有PK。

如果我更新表A-B中的b_id,我希望它更新表B-C中的b_id,其中x_id匹配。

如果我尝试创建外键约束,它会告诉我

“没有唯一约束匹配给定引用表的键......”

我知道它不是这样做的,因为(x_id,b_id)不是唯一约束,但它不能,因为我将有多个c_id具有相同的b_id和x_id。

希望这是有道理的。

使用触发器执行此操作的唯一方法是什么?

1 个答案:

答案 0 :(得分:1)

  

我知道它没有这样做,因为(x_id,b_id)不是   唯一约束,但它不能,因为我将有多个c_id   使用相同的b_id和x_id。

为了更新表A-B级联到表B-C中的b_id,您需要

  • 对包含Table_A-C.b_id,
  • 的某些列的唯一约束
  • Table_B-C中的同一组列和
  • Table_B-C中的外键引用引用Table_A-C中的同一组列,使用ON UPDATE CASCADE。

我不清楚你的当前结构是否可行。

如果

  • Table_A-B.x_id是一个自动递增的整数,它本身就是唯一的,然后
  • 在列表_A-B中
  • ,列{x_id,b_id}的列也将是唯一的,并且
  • 表_B中的
  • ,列x_id是整数(或bigint),然后是
  • 在表_C-C中
  • 列{x_id,b_id}可以具有对Table_A-C的外键引用。