Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 是否有一个简单的命令来打包所有数据库ID,使其没有间隙_Postgresql_Postgresql 9.1 - Fatal编程技术网

Postgresql 是否有一个简单的命令来打包所有数据库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

我有我的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.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
字段,但没有适当的
外键。没有通用的解决方案,不幸的是,唯一可以做的事情就是考虑每一列包含对另一列的特别引用,并根据具体情况决定如何修复每一列。在对密钥进行大规模更新后,您可能需要更新序列