我在PostgreSQL的单个模式中有11个表。每个表都有一个名为“ id”的列,该列应该是唯一的主键。不幸的是,某些表的ID在其他表中。
如何创建新序列并使用完全唯一的值更新所有表的ID值?我必须一次完成一个序列和一张表格吗?
我是SQL的新手,所以除了创建序列和更新单个表之外,我不知道从哪里开始。
答案 0 :(得分:1)
您的问题有点含糊,但我认为您的id
的类型为int / bigint。而且您希望这些“ id”不仅在一个表中具有全局唯一性。
可能有很多选择。这是最简单但可能不是最优雅的方法之一。首先创建一个提供ID的序列,例如:
CREATE SEQUENCE globally_unique_id;
然后只需更新所有11个表,例如:
UPDATE table1 SET id = nextval('globally_unique_id');
使用此序列不会为您提供所有表中任何行的相同ID。
如果在“ id”列的其他表中有未声明在更新时级联的外键约束,则麻烦更大。但这是另一个故事。
当然,您无需逐表进行操作。例如,您可以查询Postgres系统表中的所有表(如询问的here)(或手动创建表名数组),并在某些特殊构造的查询或过程中循环查找具有id的表。
但是我认为:“仅” 11个表可能不值得对其进行编码。另一方面,如果以后需要再次执行相同的操作,则可能会很有用。