【问题标题】:How can I add a column to a postgres table in front of the others?如何在其他人前面的 postgres 表中添加一列?
【发布时间】:2014-09-21 01:17:16
【问题描述】:

我有一个包含很多列的表格,我想在现有表格的前面再添加两个(日期和时间)。

目前表格中没有数据,但我想知道最好的方法是以我需要的格式获取表格。

我可以删除表并使用正确的配置创建一个新表,但我想知道是否有更好的方法?

【问题讨论】:

  • 为什么必须在现有表的前面?当您使用 SELECT 语句提取信息时,您指定字段的顺序。
  • 两个原因:1. 我希望 select * 行为首先显示最相关的列,2 我将使用在 csv 中以这种方式组织信息的脚本写入数据库,并且调整脚本似乎比在表格前面添加几列要多一些工作。

标签: sql postgresql


【解决方案1】:

目前这是不可能的。您必须删除并重新创建表。
从理论上讲,您可以添加列、删除并重新添加所有其他列,但这几乎不切实际。

这是一个正在进行的讨论,也是 Postgres 项目的开放 TODO 项,允许对列进行重新排序。但是许多依赖项和相关考虑因素使这变得困难。

引用Postgres project's ToDo List:

通过记录显示、存储和 每列的永久ID?

与某些人的看法相反,表中列的顺序并非不相关,原因有很多。

  • 默认顺序用于像 INSERT 这样没有列定义列表的语句。
    SELECT *,它以预定义的顺序返回列。
  • 表格的复合类型使用相同的列顺序。
  • 列的顺序与存储优化相关(填充和对齐问题)。更多的:

人们可能会将此与行的顺序混淆,后者在表中未定义。

【讨论】:

  • 至少有办法获取表的架构吗?像每行的名称,varchar(100),以便我可以在重建我的巨型表时引用它?
  • @johncorser:有很多方法。 \d tbl 在 psql 中。或者使用 pgAdmin 提供的逆向工程 CREATE 脚本 ...
  • SELECT * 是一种不好的做法,不建议这样做。在没有列表的情况下插入或不使用 order by 也一样,只是因为附带的订单符合您的需要。应用程序不应该因为表中列的顺序改变而失败。
  • SELECT *INSERT 没有目标列表在某些情况下是不好的做法。但是,不会使列的顺序无关紧要。这只是一个虚假的说法。
  • 我仍然不明白为什么如果至少有一列具有可变长度,列的顺序是相关的。因为那样数据库块中的“后续”行将无法正确对齐。只有物理上位于块开头的行将受益于列顺序 - 直到其中一列变得更长(并保持在 TOAST 限制以下)
【解决方案2】:
  • 在关系数据库中,表中列的顺序无关紧要
  • 创建一个视图,按您想要的顺序显示列
  • 如果您仍想这样做,请删除该表并重新创建它

【讨论】:

  • @ErwinBrandstetter 不是“表格中的顺序”而是“表格中的列顺序”
  • 好吧,我不同意。列顺序是明确定义的,并且在多种方面都很重要。我在回答中写了更多。它与集合论或关系代数无关,但与 Postgres 实现(或任何其他 RDBMS 实现)无关。甚至在标准 SQL 中也没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2013-07-22
相关资源
最近更新 更多