将列从表移动到其父级

时间:2013-08-09 15:07:21

标签: postgresql postgresql-9.1

在postgresql 9.1中,我 tableB 继承自 tableA

tableB 中有一些列, tableA 中没有列。

我想将tableB中的列移动到 tableA 而不转储和重新导入 TableB 中的行...是否可能? (我确切地说,我直接在 tableA 中没有行。)

1 个答案:

答案 0 :(得分:1)

您可以更改父表并添加与子表中存在的列相同的列。具有相同数据类型的子表中的任何列都不会传播到子项,但是您在父项中创建但尚未存在于子项中的任何列将< / em>在子表中创建。

-- Create parent table "p"
create table p();

-- Create child table "c"
create table c (id int, val text, val2 text) inherits (p);

-- Add the columns to the parent
-- which already exist in the child table "c".
alter table p add val text;
alter table p add val2 text;

-- Add a column that does not exist in table "c"
alter table p add val_xxx bigint;


\d p
       Table "public.p"
 Column  |  Type  | Modifiers 
---------+--------+-----------
 val     | text   | 
 val2    | text   | 
 val_xxx | bigint | 
Number of child tables: 1 (Use \d+ to list them.)

编辑显示后续问题的结果,如果从父表和子表中删除了其中一列,则继承表中的行会发生什么。

begin;
-- Drop the "val" column from the parent table
alter table p drop column val; 

-- The "val" colum no longer exists in the parent table.
select * from only p;
 val2 | val_xxx 
------+---------
(0 rows)

-- The "val" column still exists in the inherited (child) table
select * from c;
 id | val | val2 | val_xxx 
----+-----+------+---------
  1 | aaa | bbb  |     999

-- Drop the column from the inherited (child) table
alter table c drop column val;

-- The "val" column no longer exists in the child table
select * from c;
 id | val2 | val_xxx 
----+------+---------
  1 | bbb  |     999

rollback;