【问题标题】:How to maintain serial integrity while changing column order in PostgreSQL tables?如何在更改 PostgreSQL 表中的列顺序时保持序列完整性?
【发布时间】:2021-02-15 15:00:26
【问题描述】:

我知道在 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 = countjoined,那将是一种验证形式。

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

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

之前:

Serial, FirstName, LastName, DoB, vector1, vector2

目前:

Serial, FirstName, LastName, DoB, vector1, vector2, Gender, SSN

预期:

Serial, FirstName, LastName, Gender, SSN, vector1, vector2

但有更多字段。由于未公开的原因,我们需要更改底层架构,而不能只更改 select 语句中的顺序。

【问题讨论】:

  • 看看CREATE TABLE AS。您可以在SELECT 中更改列顺序。
  • 为什么?没有“正式更改列位置的方法”,因为列位置 id 完全不相关。行中的列位置对于行,就像行顺序对于表一样。如果您想要不同的顺序,只需在查询中指定您想要的顺序。
  • 你想用这个解决什么实际问题?
  • 我正在尝试解决我在标题中提出的问题,看起来它是一个包含序列号的直接 SELECT,这很好。我 100% 知道列位置无关紧要,感谢您浪费您的呼吸。

标签: sql postgresql database-design database-schema


【解决方案1】:

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

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

但是,正如 Belayer 所说,整个练习毫无意义。

【讨论】:

  • 我知道这毫无意义,可惜我上面的人不同意,所以我来了。
  • 我理解并同情。定义视图不行吗?
猜你喜欢
  • 2022-12-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多