运行了很长时间后,我在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修饰符.
例如:
创建表,放入一些数据,并删除中间值:
db=# create sequence xseq; CREATE SEQUENCE db=# create table foo ( id bigint default nextval('xseq') not null,data text ); CREATE TABLE db=# insert into foo (data) values ('hello'),('world'),('how'),('are'),('you'); INSERT 0 5 db=# delete from foo where data = 'how'; DELETE 1 db=# select * from foo; id | data ----+------- 1 | hello 2 | world 4 | are 5 | you (4 rows)
重置您的序列:
db=# ALTER SEQUENCE xseq RESTART; ALTER SEQUENCE
更新您的数据:
db=# update foo set id = DEFAULT; UPDATE 4 db=# select * from foo; id | data ----+------- 1 | hello 2 | world 3 | are 4 | you (4 rows)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。