使用pg_dump获取子表的ddl

时间:2012-10-31 12:01:30

标签: postgresql

我有一个日志表,有几个子表继承它。但我的问题 很难形容。让我们开始吧。

- 1环境

PostgreSQL版本:9.0.3

操作系统:红帽企业Linux服务器版本5.5

- 2个父表和子表

 Schema |            Name             | Type  | Owner  |  Size   |  Description   
--------+-----------------------------+-------+--------+---------+----------------
 suplog | tbl_log        | table | suplog | 0 bytes | qq自更新日志表
 suplog | tbl_log_201205 | table | suplog | 59 GB   | 
 suplog | tbl_log_201206 | table | suplog | 58 GB   | 
 suplog | tbl_log_201207 | table | suplog | 57 GB   | 
 suplog | tbl_log_201208 | table | suplog | 51 GB   | 
 suplog | tbl_log_201209 | table | suplog | 39 GB   | 
 suplog | tbl_log_201210 | table | suplog | 36 GB   | 

tbl_log是父表,所有xxx__yyyymm都是子表并继承   table tbl_log。

我使用以下sql创建子表:

create table tbl_log_201210 ( like tbl_log including all ) inherits ( tbl_log );

- 3添加列表

然后由于某种原因,我们想在父表和子表中添加一列。 我们只需要一个命令,如下所示:

Alter table tbl_log add column address character varying(255) ;

- 4 pg_dump子表

现在,我需要获取子项的create table语句,所以我使用pg_dump获取ddl。

pg_dump -h 127.0.0.1 -p 1921 -E UTF8 -t "suplog.tbl_log_201210" -s -v suplog > suplog.tbl_log_201210.ddl

从上面的命令,令我惊讶的是,文件suplog.tbl_log_201210.ddl的create table命令 不包含“addres”列,这是“ALTER TABLE”命令添加的新列。

- 5查询视图pg_attribute

suplog=> select attname,attislocal from pg_attribute where attrelid='tbl_log_201210'::regclass
and attname='address';
     attname     | attislocal 
-----------------+------------
 recommend_appid | f


we can see the column attislocal of view pg_attribute of that table show 'f'。

我不知道为什么,这是一个错误吗?

2 个答案:

答案 0 :(得分:3)

您的dump命令只询问子表的架构。该子项的create不包含任何列,只包含inherits

CREATE TABLE child (
    inherits parent
);

令人惊讶的是什么?

修改

使用like参数可以解耦两个表。他们不是父母和孩子。查看manual

如果您分两个步骤执行此操作,则可以正常工作。首先create like,然后是alter table inherit

Similar question answered by one of the developers

答案 1 :(得分:2)

9.0.3是七个bug修复版本,除了提到两个主要版本。有人发布了,因为删除了答案显示这在9.2上按预期工作。我注意到9.0.7包括this commit

  

修复pg_dump以更好地处理继承列。

     

修改pg_dump对继承列的处理,这是最后一次查看的   认真地在2001年,消除了几个与之相关的不良行为   继承了默认表达式和NOT NULL标志。特别要确保   如果和,则在子表的CREATE TABLE命令中打印一列   只有它有attislocal = true;以前的行为有时会导致   当一个列没有在标记中标记时,将成为标记为attislocal的列   源数据库。此外,停止依赖默认的文本比较   表达式决定他们是否继承;相反,不要使用   默认表达式继承,但只需安装默认值   明确地在层次结构的每个级别。这解决了   Chester Young最近展示了与搜索路径相关的不当行为   还删除了一些关于ALTER TABLE的顺序的可疑假设   将执行SET DEFAULT命令。

     

对所有支持的分支进行补丁。

发行说明表明这是为了处理默认处理而添加的,但我怀疑此补丁也解决了您的问题。你能升级到9.0.10,看看这种行为是否仍然存在?