2017-06-09 7 views
2

PostgreSQLデータベースにいくつかの共通のカラムを持つテーブルがいくつかあります。私はそれらの共通の列を新しいテーブルに移動し、この新しいテーブルからテーブルを継承すると良い考えだと思っていました。リファクタリング後テーブルを再作成せずに別のテーブルから継承させるためにテーブルのスキーマを変更する

create table foo_bar (
    code varchar(9) primary key, 
    name varchar, 
    bar integer 
); 

:たとえば

create table foo (
    code varchar(9) primary key, 
    name varchar 
); 

create table foo_bar (
    bar integer 
) inherits (foo); 

問題がある、私は、この表を参照してくださいfoo_barで大量のデータだけでなく、多くの景色を眺めることができます。

foo_barの定義を変更して、テーブル内のデータを削除せずに上記の変更を行うことはできますか?

答えて

1
CREATE TABLE foo (
    code varchar(9), 
    name varchar 
); 

ALTER TABLE foo_bar INHERIT foo; 
+0

ハ!私はそれが簡単だろうとは思わなかった。私はそれをテストし、それは動作します。唯一の奇妙なことは、データベースをダンプすると、 'foo_bar'の定義に継承されたカラムが明示的に表示されることです。私はそれらを見るべきではない。しかし、彼らは本当に継承されています。もし私が 'foo_bar'からそれらの列を削除しようとすると、私はそれらが継承されることはできないというエラーを受け取ります。ありがとう! – piokuc

2

これは良い考えではありません。データベース設計は正確にオブジェクト指向プログラミングではありません。 caveatsがあります。

継承機能の重大な制限は、インデックス(ユニーク制約を含む) と外部キー制約だけではない彼らの相続の子どもたちに、単一のテーブルに を適用することです。 では、外部キー制約の参照側と参照側の両方に該当します。

さらに、このリンクには、注意する必要のある問題がいくつかあります。

本当にこれを進めたいのであれば、テーブルを変更する方法はLaurenz Albeの答えです。

+0

ありがとうございます。私のケースでは、注意点は問題ではなく、ベーステーブルを選択してPostgreSQLが自動的にすべての "子"テーブルを選択できるという事実は非常に便利です。 – piokuc

関連する問題