1

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

--1 环境

PostgreSQL 版本:9.0.3

操作系统:Red Hat Enterprise Linux Server 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 为子表,继承表 tbl_log。</p>

我使用以下 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 子表

现在,我需要获取一个child的create table语句,所以我使用pg_dump获取ddl。</p>

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 的创建表命令不包含列“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'。

不知道为什么,是bug吗?</p>

4

2 回答 2

3

您的转储命令只要求子表的架构。孩子的create不包含任何列,而只是inherits

CREATE TABLE child (
    inherits parent
);

这有什么好惊讶的?

编辑

参数的使用like将两个表解耦。他们不是父母和孩子。检查手册

如果您分两个单独的步骤执行此操作,它可以工作。先后create likealter table inherit

一位开发人员回答了类似的问题

于 2012-10-31T13:06:35.880 回答
2

9.0.3 落后了七个错误修复版本,此外还提到了两个主要版本。有人发布并删除了一个答案,表明这在 9.2 上按预期工作。我注意到 9.0.7 包含此提交

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

修改 pg_dump 对继承列的处理,这是在 2001 年最后一次认真研究,以消除与继承的默认表达式和 NOT NULL 标志相关的几个不当行为。特别要确保在子表的 CREATE TABLE 命令中打印列当且仅当它具有 attislocal = true; 前一种行为有时会导致在源数据库中未如此标记的列被标记为 attislocal。此外,停止依赖默认表达式的文本比较来确定它们是否被继承;相反,根本不使用默认表达式继承,而只是在层次结构的每个级别显式安装默认值。这修复了 Chester Young 最近展示的与搜索路径相关的不当行为,

回补丁到所有支持的分支。

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

于 2012-10-31T13:53:34.827 回答