2

basetemplate以下を使用して作成され たテーブルがあります。

CREATE TABLE basetemplate (
    time_of_creation timestamp with time zone,
);

table1今、私は、table2異なるフィールドを使用して作成したいと考えていますが、両方ともtime_of_creationフィールドを含んでいます。と を使っCREATE TABLE LIKEてみCREATE TABLE INHERITSました。同じクエリで指定された新しいテーブルのフィールドを使用して新しいテーブルを作成できるため、これCREATE TABLE INHERITSは私の要件により適しているように見えました。しかし、他の方法では、ALTER TABLEクエリを使用して新しいテーブルの特定のフィールドを追加する必要があります。 CREATE TABLE INHERITSフィールドを継承し、その制約。しかし、そのコメントではありません。
私の質問は、これが私のニーズを満たすための最良の方法であるかどうか、および を使用するときにコメントを継承する方法があるかどうかですCREATE TABLE INHERITS

4

1 に答える 1

3

CREATE TABLE INHERITSテーブル定義を複製するだけには適していません。テーブルの実際のデータはリンクされているため、それが望ましくない場合は、テーブルの継承を使用せず、CREATE TABLE ... LIKEまたはCREATE TABLE ... OF TYPEを使用してから、コマンドでフィールドを追加しALTER TABLEます。それが面倒すぎる場合は、新しいテーブルを定義するか、複合型またはドメインを使用する必要があるというサインかもしれません。

OOP ポリモーフィック継承を SQL に適用しようとしているようです。素晴らしいアイデアではありません。この場合、最善の策はほぼ間違いなく、共通フィールドの繰り返しに耐えることです。より複雑なケースでは、 を作成するDOMAINか、 を使用して複合型を作成できますCREATE TYPEが、この場合は不要です。各テーブルのフィールドを繰り返すだけです。

を使用INHERITSしてベース テーブルに行を挿入すると、次のようになります。

regress=> CREATE TABLE basetemplate (
    time_of_creation timestamp with time zone
);
CREATE TABLE
regress=> CREATE TABLE table1 (col1 text) INHERITS (basetemplate);
CREATE TABLE
regress=> INSERT INTO table1(col1, time_of_creation) VALUES ('a', current_timestamp);
INSERT 0 1
regress=> SELECT * FROM table1 ;
       time_of_creation        | col1 
-------------------------------+------
 2012-11-08 16:23:35.645734+08 | a
(1 row)

ここまでは問題ありませんが、現在:

regress=> select * from basetemplate ;
       time_of_creation        
-------------------------------
 2012-11-08 16:23:35.645734+08
(1 row)

これはおそらくあなたが望むものではありません。

実際には害はありません。table1継承のため、行を挿入するオーバーヘッドはありません。ただし、後でいくつかの管理タスクを実行するのがより複雑になることがわかります。また、テーブルのパーティショニングなども複雑になります。全体として、必要がない限り、継承の使用はお勧めしません。

于 2012-11-08T08:20:12.737 に答える