1

複数の子テーブルが継承するログテーブルがありますが、質問を説明するのは難しいです。始めましょう。

--1環境

PostgreSQLバージョン:9.0.3

OS:Red Hat EnterpriseLinuxServerリリース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>

そして、次のsqlcreate子テーブルを使用します。

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

--3列テーブルを追加します

次に、何らかの理由で、親テーブルと子テーブルの両方に列を追加したいと思います。次のようなコマンドが必要です。

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

--4pg_dump子テーブル

ここで、子の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のcreate tableコマンドには、「ALTERTABLE」コマンドによって追加された新しい列である列「addres」が含まれていません。

--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'。

理由はわかりませんが、それはバグですか?</ p>

4

2 に答える 2

3

dumpコマンドは、子テーブルのスキーマのみを要求します。子のcreateforには列は含まれていませんが、次のようになっていinheritsます。

CREATE TABLE child (
    inherits parent
);

それについて何が驚くべきですか?

編集

パラメータを使用すると、like両方のテーブルが分離されます。彼らは親子ではありません。マニュアルを確認してください

これを2つの別々のステップで行うと機能します。最初create likeにそして後でalter table inherit

開発者の1人が答えた同様の質問

于 2012-10-31T13:06:35.880 に答える
2

9.0.3は、2つのメジャーバージョンが遅れていることに加えて、7つのバグ修正リリースが遅れています。誰かが投稿し、回答を削除してから、これが9.2で期待どおりに機能することを示しています。9.0.7にはこのコミットが含まれていることに注意してください:

継承された列の処理を改善するためにpg_dumpを修正しました。

2001年に最後に真剣に検討されたpg_dumpの継承された列の処理を改訂して、継承されたデフォルト式とNOTNULLフラグに関連するいくつかの誤動作を排除します。特に、列がattislocal = trueである場合にのみ、子テーブルのCREATETABLEコマンドで列が出力されることを確認してください。前者の動作では、ソースデータベースでそのようにマークされていない場合に、列がattislocalとマークされることがありました。また、デフォルトの式のテキスト比較に依存して、それらが継承されているかどうかを判断するのはやめましょう。代わりに、default-expression継承をまったく使用せずに、階層の各レベルにデフォルトを明示的にインストールしてください。これにより、チェスター・ヤングが最近示した検索パス関連の不正行為が修正されます。

サポートされているすべてのブランチにバックパッチします。

リリースノートには、これがデフォルトの処理に対処するために追加されたことが示されていますが、このパッチはあなたの問題にも対処していると思います。9.0.10にアップグレードして、この動作が続くかどうかを確認できますか?

于 2012-10-31T13:53:34.827 に答える