2017-05-26 21 views
0

私は2つのテーブルを作成しています。まず、検証ステップのようなものになりますが、検証が成功した後に2番目のデータが保持されます。別のテーブルの列にユニークな制約があります

だから私の最初のテーブルには、次のとおりです。

CREATE TABLE TABLE_NAME_TEMP(
    SOME_NO number not null, 
    GROUP_NAME VARCHAR2(100) NOT NULL, 
    PARENT_GROUP_ID INT, 
    PRIMARY KEY (SOME_NO), 
    CONSTRAINT FK_PARENT FOREIGN KEY(PARENT_GROUP_ID) REFERENCES 
    TABLE_NAME(ID), 
    CONSTRAINT GROUP_NAME_UNIQUE UNIQUE (TABLE_NAME.GROUP_NAME, GROUP_NAME) 
); 

と検証に合格した後に保持する第2のテーブル:

CREATE TABLE TABLE_NAME(
    ID number not null, 
    GROUP_NAME VARCHAR2(100) NOT NULL, 
    PARENT_GROUP_ID INT, 
    PRIMARY KEY(ID), 
    CONSTRAINT FK_PARENT FOREIGN KEY(PARENT_GROUP_ID) REFERENCES 
    TABLE_NAME(ID), 
    CONSTRAINT GROUP_NAME_UNIQUE UNIQUE (GROUP_NAME), 
    CONSTRAINT PK_ID_UNIQUE UNIQUE (ID) 
); 

私の問題はGROUP_NAMEは、TABLE_NAMEで一意でなければならないということです。ですから、TABLE_NAME_TEMPのGROUP_NAMEがTABLE_NAMEの既存の値と一致しないようにする必要があります。私が試したのはCONSTRAINT GROUP_NAME_UNIQUE UNIQUE (TABLE_NAME.GROUP_NAME, GROUP_NAME)です。エラーが発生します。何かアドバイス?

+3

指定したGROUP_NAMEをTABLE_NAME_TEMPまたはTABLE_NAMEのいずれかに1回だけ表示したいが、その両方には表示しないことをお勧めしますか?そうであれば、一意の制約で単一の表にしか適用できないため、実現することはできません。さらに、ある時点では、両方のテーブルにエントリを持つことになります。これは、別のテーブルに移動する前に何かを削除するのが珍しいからです。通常、行をコピーしてから削除します。私はなぜそれが検証されているかどうかを示すフラグを持つ単一のテーブルを持っていないのだろうか? – Boneist

+0

@Boneist確かにこれは私が意味することです、私は行くと私は行くだろうし、手続きの周りにいくつかの仕事を試してみて – Hatik

+0

検証されたフラグ列を持つ単一のテーブルではなく、2つの別々のテーブルの理由は何ですか? (また、 "先生"は大きな前提です!* {;-)) – Boneist

答えて

2

一意性制約を2つの別個の表に定義することはできません。それはユニークな制約の仕組みではありません。次のいずれかを実行できます。

  1. データモデルを修正してください。ユニークな制約を2つのテーブルに分散させると、データモデルの問題が示唆されます。すべての名前をグループのタイプを識別する単一のテーブルに入れます。
  2. トリガーを使用します。

ビューに一意の制約を追加することもできます。まあ、で一意制約を指定できますが、強制はしません。デフォルトでは、制約は「無効、検証なし」モードです。

2

TABLE_NAME_TEMPは何らかのステージングテーブルです。データウェアハウス環境では、ステージングテーブルの最終的なテーブル(シナリオではTABLE_NAME)よりも緩い制約があります。 TABLE_NAME_TEMP.GROUP_NAMEの値はTABLE_NAMEに存在しないことを確認し

は「検証が渡された後、第2のデータを保持する一方で最初の、検証工程のようになります」検証ステップのように思えます。 TABLE_NAME_TEMPに重複がある場合は、ロードを失敗させることなくそれらを調べることができるように、ロードすることができます(ステージングテーブルへのデータの取得方法によって異なります)。最終的な表をロードする時間になったら、それらを削除するかフィルタするだけです。

関連する問題