如何进行级联更新?

时间:2016-06-29 15:19:34

标签: postgresql sql-update

我有一组表,其列在另一个表的用户名列上具有外键约束。我已被指示不要将ON UPDATE CASCADE添加到表格定义中,因为我们不想默默地丢失活动日志等信息。我们只想在这个实例中明确级联。我还没有找到一个如何在查询中执行此操作的示例。我认为它看起来像

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

这可能吗?

2 个答案:

答案 0 :(得分:10)

在Postgres(和其他RDBM)中,级联更新仅适用于外键。例如:

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) 

事实上,不需要其他选项。如果您认为需要对非外键的列执行此操作,则意味着该模型设计不当(不是normalized)。另一方面,外键选择性级联更新的可能性并没有解决任何实际问题,而是制定了一般规则。

答案 1 :(得分:0)

AFAIK,您不能像使用 CASCADE 那样向 UPDATE 添加 DELETE 选项。

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

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

类似的东西

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);