sql >> データベース >  >> RDS >> PostgreSQL

postgreSQLの継承を設計するために型列を追加する必要がありますか?

    たとえば、これを実行して、特定の行を参照できるサブテーブルが1つだけになるようにすることができます。

    CREATE TABLE Super_Table (
      super_id SERIAL PRIMARY KEY,
      sub_type CHAR(1) NOT NULL,
      UNIQUE KEY (super_id, sub_type) 
    );
    
    CREATE TABLE Sub_Table_A (
      super_id PRIMARY KEY,
      sub_type CHAR(1) NOT NULL,
      CHECK (sub_type = 'A'),
      FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
    );
    
    CREATE TABLE Sub_Table_B (
      super_id PRIMARY KEY,
      sub_type CHAR(1) NOT NULL,
      CHECK (sub_type = 'B'),
      FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
    );
    

    現在、Super_Tableの行を両方のサブテーブルの行で参照する方法はありません。 Super_Tableの行には「A」または「B」のいずれかが必要であるため、外部キー参照を満たすことができるのはサブテーブルの1つだけです。

    コメントを再確認してください:

    私の理解では、INHERITSの現在のPostgreSQL実装では、インデックス、一意の制約、および外部キー制約に関連する多くの異常が許可されています。この機能の使用は注意が必要で、エラーが発生しやすくなります。

    基本的に、インデックスは単一のテーブルにのみ存在するため、親テーブルに一意の制約がある場合、親とそのすべての子にその一意性をどのように適用できますか?子は、親にすでに存在する値をテーブルに挿入することも、親が子の1つにすでに存在する値を挿入することもできます。

    同様に、同じ主キーまたは一意の値を持つ親/子に複数の行が存在する可能性がある場合、どの行が参照されるかがあいまいであるため、外部キーは親テーブルやその子を参照できません。

    これらは、PostgreSQLのINHERITSの既知の未解決の制限です。上に示した設計では、主キーの問題は解決されますが、二次一意キーの問題は解決されません。

    http://archives.postgresql.org/pgsql-hackers/2010 -05 / msg00285.php




    1. SQLはテーブルの行をカウントします

    2. MySQLで接続タイムゾーンを変更する

    3. SQLエラーORA01427

    4. MySQL1対多からJSON形式