Postgresql 是否有一个简单的命令来打包所有数据库ID,使其没有间隙
我有我的Postgres数据库,我使用hibernate序列生成ID。但所有表的顺序都是相同的。但现在我的计划是为每一张表设置一个单独的序列。我想使用一个命令为一个表连续打包ID,但不破坏任何引用 您必须确保所有的Postgresql 是否有一个简单的命令来打包所有数据库ID,使其没有间隙,postgresql,postgresql-9.1,Postgresql,Postgresql 9.1,我有我的Postgres数据库,我使用hibernate序列生成ID。但所有表的顺序都是相同的。但现在我的计划是为每一张表设置一个单独的序列。我想使用一个命令为一个表连续打包ID,但不破坏任何引用 您必须确保所有的外键引用在更新级联时都有(要添加它:),然后您可以使用: UPDATE mytable AS m SET id = n.rank FROM (SELECT id, rank() OVER (ORDER BY id) FROM mytable) AS n WHERE m.id = n.i
外键
引用在更新级联时都有(要添加它:),然后您可以使用:
UPDATE mytable AS m
SET id = n.rank
FROM (SELECT id, rank() OVER (ORDER BY id) FROM mytable) AS n
WHERE m.id = n.id
这将为您提供与原始ID顺序相同的顺序ID:
> SELECT * FROM mytable ORDER BY id;
id | name
1 | Alex
5 | David
10 | Jane
> UPDATE …;
…
> SELECT * FROM mytable ORDER BY id;
id | name
1 | Alex
2 | David
3 | Jane
为什么需要“打包”表的id字段?旧数据库包含使用跳过生成的id。我不想再发生这种事了。由于新的id可以很好地自行打包,我也希望更改旧的id。如果您使用标准序列生成id,那么它们中仍然会有间隙。可能有一些表引用了其他id
字段,但没有适当的外键。没有通用的解决方案,不幸的是,唯一可以做的事情就是考虑每一列包含对另一列的特别引用,并根据具体情况决定如何修复每一列。在对密钥进行大规模更新后,您可能需要更新序列