2

誰かがこれを手伝ってくれますか?単一の親テーブルから継承されたテーブルのセットがあります(これらのテーブルにはすべてデータが含まれています)。

親テーブルから特定の列を削除する必要があり、継承されたすべてのテーブルから同じ列が自動的に削除される必要があります。これは可能ですか?

これを試したところ、親テーブルの列のみが削除されました。変更テーブルでもカスケードオプションを試しましたが、結果がありません。

私はpostgreSql8.3を使用しています

4

3 に答える 3

3

Postgres 9.3 でこの同じ問題に遭遇しました。この問題は、次のシナリオでのみ発生するようです。

1)

create table parent_table(a int);
create table child_table(a int) inherits (parent_table);

2)

create table parent_table(a int);
create table child_table(a int);
alter table child_table INHERIT parent_table;

シナリオ 2) は 1) よりも可能性が高く、1) では代わりに次のことができるためです。

create table parent_table(a int);
create table child_table() inherits (parent_table);

両方のテーブルで同じ列を取得します。

ただし、シナリオ 2) では、child_table に、parent_table のすべての列とその制約が必要です。Postgresのドキュメントによると:

INHERIT 親テーブル

このフォームは、指定された親テーブルの新しい子としてターゲット テーブルを追加します。その後、親に対するクエリには、ターゲット テーブルのレコードが含まれます。子として追加するには、ターゲット テーブルに親と同じ列がすべて含まれている必要があります (追加の列を持つこともできます)。列のデータ型は一致している必要があり、親に NOT NULL 制約がある場合は、子にも NOT NULL 制約がある必要があります。

親のすべての CHECK 制約に対して、一致する子テーブルの制約も存在する必要があります。現在、UNIQUE、PRIMARY KEY、および FOREIGN KEY 制約は考慮されていませんが、これは将来変更される可能性があります。

この結果、事後にテーブルに継承を追加し、親テーブルの列を削除した場合、DROP CASCADE を使用しても、その列は子テーブルから削除されません。

于 2015-04-10T14:50:48.723 に答える
0

親テーブルで列が削除されると、継承されたテーブルでも削除されます。マニュアルには次のように書かれています。

ALTER TABLE は、列データ定義の変更を伝播し、継承階層の下に制約をチェックします。ここでも、親テーブルの列または制約を削除できるのは、CASCADE オプションを使用している場合のみです。ALTER TABLE は、CREATE TABLE 中に適用される重複列のマージと拒否に関する同じ規則に従います。

これを試して:

create table parent_table(a int, b int);
create table child_table(c int) inherits (parent_table);

結果:

# \d child_table
  テーブル「public.child_table」
 コラム | タイプ | 修飾子
------+---------+-----------
 | | 整数 |
 b | 整数 |
 c | 整数 |
継承: parent_table

では、列を にドロップしてみましょうparent_table:

alter table parent_table drop column a cascade;

結果:

\d 子テーブル
  テーブル「public.child_table」
 コラム | タイプ | 修飾子
------+---------+-----------
 b | 整数 |
 c | 整数 |
継承: parent_table

DROP COLUMN は、期待どおりに子テーブルに反映されました。

テーブル定義で異なる結果が得られた場合は、ドロップ SQL ステートメントと同様に、これらの定義を質問に含める必要があります。

于 2013-01-09T14:52:35.547 に答える