我有一组表,其中的列对另一个表中的用户名列具有外键约束。我被指示不要将
ON UPDATE CASCADE
添加到表定义中,因为我们不想默默地丢失活动日志等信息。我们只想在这一实例中显式级联。不过,我还没有找到如何在查询中执行此操作的示例。我想它会看起来像
UPDATE CASCADE "MySchema"."MyTable"
SET user_name = "John Smith"
WHERE user_id = 1
这可能吗?
在 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)
其实不需要其他选项。如果您觉得需要对不是外键的列执行此操作,则意味着该模型设计不佳(它没有标准化)。另一方面,选择性级联更新外键的可能性并不能解决任何实际问题,而是违反了一般规则。
据我所知,您无法像使用
CASCADE
那样向 UPDATE
添加 DELETE
选项。
相反,在 a 中(可能在事务中)执行以下操作。
类似的东西
ALTER TABLE fk_table DROP CONSTRAINT mytable__table_w_fk__fk;
ALTER TABLE 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 TABLE fk_table DROP CONSTRAINT mytable__table_w_fk__fk;
ALTER TABLE fk_table ADD CONSTRAINT mytable__table_w_fk__fk
FOREIGN KEY (fk) REFERENCES mytable (pk);