首页 > 解决方案 > 使用第一列创建表,然后从另一个表中复制所有列

问题描述

有没有办法做标题所说的而不必使用这样的东西

Insert into TableB
(Col1, Col2 ,Col3)
Select Col1, Col2 ,Col3 from TableA

TableA 有超过 40 列,所以这很乏味。

TableB 将以手动创建的一列结束,并且是第一列,然后将从 TableA 复制所有其他列名和数据结构。

为了澄清,在此操作之后将不需要 TableA。最终目标是在 TableA 的开头获得一个新列。我认为这样做的唯一方法是创建一个新表,其中包含新列和来自 tabelA 的数据,但是任何可以完成任务的解决方案都可以。

标签: postgresql

解决方案


你可以通过给新列一个别名来做到这一点,然后通配符其余的。

insert into TableB
select
  (some expression) as newColumn, *
from TableA

您也可以通过这种方式创建表。

create table TableB as
select
  (some expression) as newColumn, *
from TableA

TableB 将以手动创建的一列结束,并且是第一列,然后将从 TableA 复制所有其他列名和数据结构。

由于我们设置触发器的方式,我需要在表中插入一列,但它必须位于表的开头,而不是结尾。那是最终的目标。

应避免重复数据。请考虑一个视图。它看起来像一个表格,但它不会复制任何内容。它非常适合保持与旧查询或坏查询的兼容性。

create view tableB as
select
  (some expression) as newColumnName, *
from tableA

或者“重新排序”表:创建新表,删除旧表,然后重命名新表。有关更多信息,请参阅此答案

create table TableB as
select
  (some expression) as newColumn, *
from TableA;

drop table tableA;

alter table tableB rename to tableA;

同时,应该修复任何依赖列顺序的查询。


推荐阅读