如何进行级联更新?

Joe*_*e M 8 postgresql sql-update

我有一组表,其列在另一个表的用户名列上具有外键约束.我被告知不要添加ON UPDATE CASCADE到表定义中,因为我们不想默默地丢失活动日志之类的信息.我们只想在这个实例中明确级联.我无法在查询中找到如何执行此操作的示例.我觉得它看起来像

UPDATE CASCADE "MySchema"."MyTable"
SET user_name = "John Smith"
WHERE user_id = 1
Run Code Online (Sandbox Code Playgroud)

这可能吗?

kli*_*lin 13

在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) 
Run Code Online (Sandbox Code Playgroud)

实际上,不需要其他选项.如果您觉得需要对非外键的列执行此操作,则意味着该模型设计不当(未进行规范化).另一方面,外键的选择性级联更新的可能性不能解决任何实际问题,而是制动一般规则.

  • 所以我希望那个向我展示正确方向的人. (4认同)
  • 它是否包含虚假或误导性信息?值得投反对票吗? (2认同)
  • 如果要引用不同的列,请在更新级联上使用“group_id int引用组(不同的列)” (2认同)
  • @HarshaLaxman - 有效的规则在设计关系时提供了更大的灵活性。一个表可能包含许多外键,其中一些应该自动更新,另一些则不能。相反,目标表可以由一个具有级联更新的表引用,也可以由另一个没有级联更新的表引用,具体取决于设计者的决定。 (2认同)

Cer*_*vEd 8

AFAIK,您不能CASCADEUPDATE使用DELETE.

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

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

就像是

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;
Run Code Online (Sandbox Code Playgroud)

进行更新

UPDATE "MySchema"."MyTable"
SET user_name = "John Smith"
WHERE user_id = 1
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)