首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用pg_dump获取子表的ddl

使用pg_dump获取子表的ddl
EN

Stack Overflow用户
提问于 2012-10-31 12:01:30
回答 2查看 1.2K关注 0票数 1

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

--1环境

PostgreSQL版本: 9.0.3

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

--2父表和子表

代码语言:javascript
运行
复制
 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。

我使用以下sql子表:

代码语言:javascript
运行
复制
create table tbl_log_201210 ( like tbl_log including all ) inherits ( tbl_log );

-3添加列表

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

代码语言:javascript
运行
复制
Alter table tbl_log add column address character varying(255) ;

--4 pg_dump子表

现在,我需要获得一个子表的create语句,所以我使用pg_dump获取ddl。

代码语言:javascript
运行
复制
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命令不包含列"addres“,这是一个由"ALTER”命令添加的新列。

--5查询视图pg_attribute

代码语言:javascript
运行
复制
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'。

我不知道为什么,那是窃听器吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-31 13:06:35

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

代码语言:javascript
运行
复制
CREATE TABLE child (
    inherits parent
);

这有什么令人惊讶的?

编辑

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

如果你在两个不同的步骤中这样做的话,它就能工作。先是create like,然后是alter table inherit

其中一个开发人员回答了类似的问题

票数 3
EN

Stack Overflow用户

发布于 2012-10-31 13:53:34

除了提到后面的两个主要版本之外,9.0.3是后面的七个bug修复版本。有人发布并删除了一个答复,显示这在9.2上的效果与预期的一样。我注意到9.0.7包括此承诺

用于更好地处理继承列的Fix pg_dump . 修改pg_dump对继承列的处理,这是在2001年认真研究的,以消除与继承的默认表达式和NOT NULL标志相关的几个错误行为。特别是,确保在子表的CREATE命令中打印列,当且仅当它具有attislocal = true;前一种行为有时会导致列在源数据库中没有被标记为attislocal时标记为attislocal。另外,停止依赖于默认表达式的文本比较来决定它们是否是继承的;相反,根本不要使用默认表达式继承,而只是在层次结构的每个级别显式地安装默认表达式。这修复了Chester Young最近展示的与搜索路径相关的错误行为,并消除了关于ALTER默认命令执行顺序的一些可疑假设。 向所有支持的分支返回修补程序。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13157466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档