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

前端之家收集整理的这篇文章主要介绍了postgresql – 压缩或重新编号所有表的ID,并将序列重置为max(id)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
运行了很长时间后,我在id字段中得到越来越多的漏洞.一些表的id是int32,id序列达到了它的最大值.一些 Java代码是只读的,所以我不能简单地将id列类型从int32更改为long,这会破坏API.

我想重新编号.这可能不是一个好的做法,但好或坏并不关心这个问题.我想重新编号,尤其是那些很长的ID,如“61789238”,“548273826529524324”.我不知道他们为什么这么久,但更短的ID也更容易手动处理.

但由于引用和约束,手动压缩ID并不容易.

Postgresql本身是否支持ID重新编号?或者这项工作是否有任何插件或维护工具?

也许我可以写一些存储过程?那将是非常好的,所以我可以每年安排一次.

假设您的id是从bignum序列生成的,只需重新启动序列并使用idcolumn = DEFAULT更新表.

CAVEAT:如果此id列被其他表用作外键,请确保已打开on update cascade修饰符.

例如:

创建表,放入一些数据,并删除中间值:

  1. db=# create sequence xseq;
  2. CREATE SEQUENCE
  3. db=# create table foo ( id bigint default nextval('xseq') not null,data text );
  4. CREATE TABLE
  5. db=# insert into foo (data) values ('hello'),('world'),('how'),('are'),('you');
  6. INSERT 0 5
  7. db=# delete from foo where data = 'how';
  8. DELETE 1
  9. db=# select * from foo;
  10. id | data
  11. ----+-------
  12. 1 | hello
  13. 2 | world
  14. 4 | are
  15. 5 | you
  16. (4 rows)

重置您的序列:

  1. db=# ALTER SEQUENCE xseq RESTART;
  2. ALTER SEQUENCE

更新您的数据:

  1. db=# update foo set id = DEFAULT;
  2. UPDATE 4
  3. db=# select * from foo;
  4. id | data
  5. ----+-------
  6. 1 | hello
  7. 2 | world
  8. 3 | are
  9. 4 | you
  10. (4 rows)

猜你在找的Postgre SQL相关文章