sql - 生成 SQL 以更新主键

标签 sql postgresql introspection

我想更改一个主键和所有引用该值的表行。

# table master
master_id|name
===============
foo|bar

# table detail
detail_id|master_id|name
========================
1234|foo|blu

如果我给一个脚本或函数

 table=master, value-old=foo, value-new=abc

我想创建一个 SQL 片段,对所有引用表“master”的表执行更新:

update detail set master_id=value-new where master_id=value-new;
.....

在内省(introspection)的帮助下,这应该是可能的。

我用的是 postgres。

更新

问题是,有许多表具有表“master”的外键。我想要一种方法来自动更新所有具有主表外键的表。

最佳答案

到目前为止,处理主键更改的最简单方法是ALTER您的引用外键约束为ON UPDATE CASCADE

然后您可以自由更新主键值,并且更改将级联到子表。由于所有随机 I/O,这可能是一个非常缓慢的过程,但它会起作用。

在此过程中,您需要注意不要违反主键列的唯一性约束。

一个更简单但更快的方法是为新的 PK 添加一个新的 UNIQUE 列,填充它,向所有指向新 PK 的引用表添加新列,删除旧的 FK 约束和列,然后最后放弃旧的 PK。

关于sql - 生成 SQL 以更新主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18271622/

相关文章:

mysql - MYSQL 中的查询,其中列作为表名,另一列作为列作为表名的外键

postgresql - fatal error 锁文件 "postmaster.pid"已经存在

python - 获取Python中调用函数模块的__name__

ruby-on-rails - Ruby on Rails : how to check pluralized and single form of names

python - 针对 NumPy dtypes 的验证——检查值最不迂回的方法是什么?

sql - 允许 null 的 ORDER BY 列速度很慢。为什么?

c# - 我可以防止 SQL 注入(inject)吗?

mysql - 查找不属于特定组的用户

postgresql - 在 postgres 中使用 table.column%type-argument 获取关于函数的元数据

postgresql - 如何在 PostgreSQL 的全文搜索中匹配 "C#"和 "C++"之类的东西?