如何执行级联更新



我有一组表,其中的列对另一个表中的用户名列有外键约束。我被指示不要将ON UPDATE CASCADE添加到表定义中,因为我们不想从活动日志等东西中默默地丢失信息。我们只想在这一个实例中显式级联。我还没能找到如何在查询中做到这一点的例子。我想它看起来应该像

UPDATE CASCADE "MySchema"."MyTable"
SET user_name = "John Smith"
WHERE user_id = 1

这可能吗?

在Postgres(和其他RDBMs)中,级联更新只适用于外键。例子:

create table groups (
    group_id int primary key
);
    
create table users (
    user_id int primary key, 
    group_id int references groups on update cascade
);
insert into groups values (1);
insert into users values (1, 1);
update groups set group_id = 10 where group_id = 1;
select * from users;
 user_id | group_id 
---------+----------
       1 |       10
(1 row) 

实际上,不需要其他选项。如果您觉得需要为非外键的列执行此操作,则意味着该模型设计得很差(没有规范化)。另一方面,选择级联更新外键的可能性并不能解决任何实际问题,反而打破了一般规则。

当然,你不能像DELETE那样在UPDATE中添加CASCADE选项。

相反,在(可能在事务中)执行以下操作。

删除原始约束/添加临时约束

之类的
ALTER fk_table DROP CONSTRAINT mytable__table_w_fk__fk;
ALTER fk_table ADD CONSTRAINT mytable__table_w_fk__fk
  FOREIGN KEY (fk) REFERENCES mytable (pk)
  ON UPDATE CASCADE;

执行更新

UPDATE "MySchema"."MyTable"
SET user_name = "John Smith"
WHERE user_id = 1

删除临时约束/添加原始约束

ALTER fk_table DROP CONSTRAINT mytable__table_w_fk__fk;
ALTER fk_table ADD CONSTRAINT mytable__table_w_fk__fk
  FOREIGN KEY (fk) REFERENCES mytable (pk);

最新更新