2017-05-26 71 views
0

我正在創建兩個表。首先將是驗證步驟,而第二步將在驗證通過後保存數據。另一個表的列上的唯一約束

所以我的第一個表是:

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) 
); 

和第二臺後驗證成功通過持有:

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中出現一次,但不是兩者都出現?如果是這樣,就不可能通過一個唯一的約束來實現,因爲這些只能應用於單個表。此外,在某些時候,您將在兩個表中都有條目,因爲在將其移到另一個表之前刪除某些內容是非常不尋常的 - 您通常會將該行復制並刪除。我想知道爲什麼你沒有一張標有表示是否驗證過的旗幟? – Boneist

+0

@骨科醫生的確是這個意思,我明白了,然後我會去嘗試一些圍繞程序的工作,謝謝主席 – Hatik

+0

這兩個獨立表格的原因是什麼,而不是一張帶有經過驗證的標誌欄的表格? (另外,「先生」是一個很大的假設!* {;-)) – Boneist

回答

2

您不能在兩個單獨的表中定義唯一約束。這不是獨特的約束如何工作。您可以執行以下操作之一:

  1. 修復數據模型。分佈在兩個表上的唯一約束表明數據模型存在問題。將所有名稱放在一個標識組類型的表中。
  2. 使用觸發器。

理想情況下,您還可以爲視圖添加唯一約束。那麼,你可以指定的唯一約束,但它沒有強制執行。默認情況下,約束處於「disable,no validate」模式。

2

TABLE_NAME_TEMP是某種臨時表。在數據倉庫環境中,臨時表上的鬆散限制比我們在最終表(在您的方案中爲TABLE_NAME)上的鬆散限制更爲常見。

「第一會像驗證步驟,而第二個將保持數據驗證後通過」

檢查的TABLE_NAME_TEMP.GROUP_NAME值不存在TABLE_NAME似乎是一個驗證步驟。如果確實在TABLE_NAME_TEMP中獲取了重複內容,則可能需要加載它們以便您可以在沒有加載失敗的情況下進行調查(取決於如何將數據導入暫存表)。只需刪除它們或在加載最終表格時加以過濾。