4

新しい行を挿入するときに、主キー列の値を親テーブルから特定の子テーブルに伝達したいと考えています。

説明のために、次の表を作成しました。

Create TABLE Material(
MatID serial PRIMARY KEY,
materialname TEXT
);

Create TABLE RealMaterial(
MatID INT REFERENCES Material(MatID),
attributereal TEXT,
PRIMARY KEY(MatID)
);

Create TABLE VirtualMaterial(
MatID INT REFERENCES Material(MatID),
attributevirt TEXT,
PRIMARY KEY(MatID)
);

RealMaterial新しいマテリアルを挿入するとき、自動的に aまたは a VirtualMaterial(新しい ID を参照)を追加したいと考えています。単一テーブル継承だけでなく、この共有主キー パターンを使用したいことを強調しておきます。

目的のためにトリガーを使用する必要がありますか?

4

2 に答える 2

0

すべてのフィールドが何を意味するのかよくわかりませんし、実際には多くの情報を提供しているわけではありませんが、トリガーを使用してこれを達成できる可能性があります。繰り返しますが、ここには多くの情報がないため、有効な例を書くつもりはありませんが、疑似コード スニペットは次のようになります。

IF (TG_OP = 'INSERT') THEN
    IF NEW.Parameter = 'REAL' THEN
        INSERT INTO RealMaterial (MatID) VALUES (NEW.MatID);
    ELSE
        INSERT INTO VirtualMaterial (MatID) VALUES (NEW.MatID);
    END IF;
END IF;

Material.Parameter と Parameter2 および Parameter3 の間の関係 (もしあれば) はわかりません。Material.Parameter がマテリアルがリアルかバーチャルかを制御すると仮定すると、INSERTS と UPDATE の両方を処理し、マテリアルを「RealMaterial」から「VirtualMaterial」に、またはその逆に移動できる必要があります。おそらく、外部キー (カスケード) で削除を処理できます。

求められていない 2 つのアドバイス:

  1. 投稿するときは、常にできるだけ多くの (関連する) 情報を提供してください。より良い答えにつながります。ここで関係を説明すると役立ちます。また、使用している PostgreSQL のバージョンに関する情報を常に含める必要があります。
  2. 私の経験から、複数のテーブルが必要ではなく、1 つのテーブルが必要なように感じます。これを単一のテーブルとして実装することを強く検討します。
于 2014-04-29T15:53:29.163 に答える