压缩或重新编号所有表的ID,并将序列重置为max(id)?

19 浏览
0 Comments

压缩或重新编号所有表的ID,并将序列重置为max(id)?

长时间运行后,我的id字段上出现了越来越多的空洞。一些表的id是int32类型,并且id序列已经接近其最大值。一些Java源代码是只读的,因此我不能简单地将id列类型从int32更改为long,否则将会破坏API。\n我想重新编号它们。这可能不是一个好的做法,但好坏并不在这个问题的考虑范围内。我想重新编号,特别是那些非常长的ID,如\"61789238\",\"548273826529524324\"。我不知道它们为什么这么长,但较短的ID也更容易手动处理。\n但是手动压缩ID并不容易,因为存在引用和约束。\nPostgreSQL本身是否支持ID重新编号?或者是否有任何插件或维护工具可以完成这项工作?\n也许我可以编写一些存储过程?这将非常好,这样我可以每年安排一次。

0
0 Comments

问题的出现原因是在数据库中添加了新的id列和外键列,但旧的列仍在使用。通过重命名的方式,应用程序不需要知道这些变化。解决方法是对所有表进行紧凑或重新编号,并将序列重置为最大的id值。

以下是解决问题的具体步骤:

1. 创建测试表one和two,并为two表的外键添加支持的索引。

2. 向one表中插入数据。

3. 从one表中删除一些数据,创建一些间隔。

4. 为one和two表添加新的key列。

5. 更新one表的new_id列,使用row_number()函数对id进行排序。

6. 更新two表的new_fk列,将其与one表的new_id列关联起来。

7. 进行最后的重命名操作,将旧的列名修改为新的列名,并重新设置主键和索引。

最后,通过查询表two和表one来进行检查。

更新部分提到了关于顺序的问题,以及新的外键约束应该与旧的约束相同。还提到了一个实现细节,即在更新过程中,Postgres会按顺序更新行。同时指出了另一个解决方案,即可以将对new_id的唯一约束添加到操作的后面。

最后提到了一个注意事项,即在进行间隔创建后,如果改变顺序,会导致更新new_id失败。

通过对表进行紧凑或重新编号,并重置序列,可以解决在数据库中添加新列和外键列时出现的问题。

0
0 Comments

表格的id列使用了bignum序列来生成id。如果想要重新编写id并将序列重置为最大的id,可以使用一些技巧来实现。

首先,创建一个名为xseq的序列,并创建一个名为foo的表格,表格中包含id和data两列。然后向表格中插入一些数据,并删除一个中间的值。删除后,可以看到表格中的id不再是连续的。

为了重新编写id,可以通过修改序列来实现。使用ALTER SEQUENCE语句重置序列xseq。然后使用UPDATE语句将id设置为DEFAULT,这将使用序列中的下一个值作为id。

通过这种方法,表格中的id将重新编写,并且变为连续的值。

然而,这种方法并不适用于所有情况。在使用这种方法之前,需要考虑一些细节。在stackoverflow的回答中提到了这些细节。

为了确保这种方法适用于所有情况,可以使用一个小技巧。在运行上述方法之前,先使用UPDATE语句将id重新编号为比当前最大id大的唯一数字。这样可以确保新的连续id不会与之前的id冲突。

通过重新编号id和重置序列,可以实现对所有表格的紧凑编写。

0
0 Comments

问题的出现原因:

- 通常情况下,表中的id列上有PRIMARY KEY或UNIQUE约束,这些约束在默认情况下是NOT DEFERRABLE的。这些约束在每一行之后进行检查,因此在尝试压缩或重新编号id时很可能会出现唯一性冲突的错误。

- 希望保留原始行的顺序,但是更新行的顺序是任意的,导致编号也是任意的。示例中保留了原始顺序,但这在实际应用中几乎从不发生。

问题的解决方法:

- 一种解决方法是临时移除主键(PK)/唯一(UNIQUE)约束以及相关的外键(FK)约束,然后重新编号id并重置序列。

- 如果有其他表中的FK列引用了tbl.id,则可以使用数据修改的CTEs来更新所有引用。

- 另一种方法是通过重命名id列,添加一个新的序列id列,并使用{oldid, newid}来更新引用的FK,然后删除{oldid, oldFK}。

以上是问题的原因和解决方法的内容,如果您有更多细节和解释,请查看上面提供的链接。

0