【发布时间】:2018-11-15 00:36:11
【问题描述】:
我在 PostgreSQL 的一个模式中有 11 个表。每个表都有一个名为“id”的列,它应该是一个唯一的主键。不幸的是,有些表的 id 在其他表中。
如何创建新序列并使用完全唯一的值更新所有表的 id 值?我必须一次做一个序列和一个表吗?
我是 SQL 新手,所以除了创建序列和更新单个表之外,我不知道从哪里开始。
【问题讨论】:
标签: postgresql
我在 PostgreSQL 的一个模式中有 11 个表。每个表都有一个名为“id”的列,它应该是一个唯一的主键。不幸的是,有些表的 id 在其他表中。
如何创建新序列并使用完全唯一的值更新所有表的 id 值?我必须一次做一个序列和一个表吗?
我是 SQL 新手,所以除了创建序列和更新单个表之外,我不知道从哪里开始。
【问题讨论】:
标签: postgresql
您的问题有点含糊,但我认为您的 ids 是 int/bigint 类型。而且您希望这些 'id's 是全球唯一的,而不仅仅是在一个表中。
可能有很多选择。这是最简单但可能不是最优雅的方式之一。首先为提供的 id 创建一个序列,例如:
CREATE SEQUENCE globally_unique_id;
然后只需通过更新浏览所有 11 个表,例如:
UPDATE table1 SET id = nextval('globally_unique_id');
使用这一序列不会为所有表中的任何行提供相同的 id。
如果您在其他表中对未声明在更新时级联的“id”列有外键约束,您将遇到更大的麻烦。但那是另一回事了。
当然,您不需要逐桌进行。例如,您可以查询所有表的 Postgres 系统表 - 例如询问 here -(或手动创建一个表名数组)并在某些特殊构造的查询或过程中循环带有 id 的表。
但在我看来:“仅”11 个表可能不值得编码。另一方面,如果您以后需要再次执行相同操作,它可能会很有用。
【讨论】: