在postgresql 9.1中,我的tableB继承自tableA。
表B中有一些列,而表A中没有列。
我想将列从tableB移动到tableA,而不从tableB转储和重新导入行…这可能吗?(确切地说,我在表A中没有直接的行)。
最佳答案
可以更改父表,并添加与子表中存在的列相同的列。在具有相同数据类型的子表中已经存在的任何列都不会传播给子代,但在父表中创建的任何列都将在子表中创建。
-- 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;