如何在更改PostgreSQL表中的列顺序时保持序列完整性?

如何在更改PostgreSQL表中的列顺序时保持序列完整性?,sql,postgresql,database-design,database-schema,Sql,Postgresql,Database Design,Database Schema,我知道在PostgreSQL中没有很好的方法来正式改变列的位置,所以我的计划是遵循以下步骤: ALTER TABLE Foo RENAME TO FooOld; CREATE TABLE IF NOT EXISTS Foo (Col1 dtype1 col2 dtype2 ....); INSERT INTO Foo (Col1, Col2, Col3) (SELECT col1, col2, col3 FROM FooOld); 我遇到的问题是验证结果。特别是,此表有一个序列号,数据的完整性

我知道在PostgreSQL中没有很好的方法来正式改变列的位置,所以我的计划是遵循以下步骤:

ALTER TABLE Foo RENAME TO FooOld;
CREATE TABLE IF NOT EXISTS Foo (Col1 dtype1 col2 dtype2 ....);
INSERT INTO Foo (Col1, Col2, Col3) (SELECT col1, col2, col3 FROM FooOld);
我遇到的问题是验证结果。特别是,此表有一个序列号,数据的完整性取决于序列号。我一直在考虑这个问题,对两个表进行计数并比较它们,然后对表之间的所有列进行内部联接,并对该联接进行计数,这可能是有意义的?如果countold=countnew=countjoin,这将是一种验证形式

我也可以将此作为一项与后端代码集成的任务来完成,因此最好在SQL之外进行验证(只有在确认两个表中的数据相同后,旧表才会被删除),但我有点担心会搞砸序列

对于一些背景:这是一个个人信息的生产表,我们添加了几个字段,然后有一些用于文本矢量化的转换列,我们决定添加更多的个人信息字段:

之前:

Serial, FirstName, LastName, DoB, vector1, vector2
目前:

Serial, FirstName, LastName, DoB, vector1, vector2, Gender, SSN
预期:

Serial, FirstName, LastName, Gender, SSN, vector1, vector2
但是有更多的领域。出于未公开的原因,我们需要更改基础架构,而不能只是更改select语句中的顺序

我遇到的问题是验证结果。特别是,此表有一个序列号,数据的完整性取决于序列号

然后,您必须像复制所有其他列一样复制序列列。然后,在备份序列上使用
setval
,将其设置为高于表中的最大值


但是,正如保莱尔所说,整个练习是毫无意义的。

看看。您可以在
选择中更改列顺序。为什么?并没有“正式改变列位置的方法”,因为列位置id完全不相关。行中的列位置相对于行的顺序与表的顺序相同。如果你想要一个不同的顺序,只需在查询中指定你想要的顺序。你想用这个来解决什么实际问题?我想解决我在标题中提出的问题,看起来这是一个包含序列的直接选择,这很好。我100%意识到专栏的位置无关紧要,谢谢你白费口舌。我意识到这毫无意义,但不幸的是,我上面的人不同意,所以我来了。我理解并同情。定义视图不行吗?