我有一个日志表,有几个子表继承它。但我的问题 很难形容。让我们开始吧。
- 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'。
我不知道为什么,这是一个错误吗?
答案 0 :(得分:3)
您的dump命令只询问子表的架构。该子项的create
不包含任何列,只包含inherits
:
CREATE TABLE child (
inherits parent
);
令人惊讶的是什么?
使用like
参数可以解耦两个表。他们不是父母和孩子。查看manual
如果您分两个步骤执行此操作,则可以正常工作。首先create like
,然后是alter table inherit
答案 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,看看这种行为是否仍然存在?