簡體   English   中英

在另一個表的列上的唯一約束

[英]Unique constraint on another table's column

我正在創建兩個表。 首先是類似於驗證步驟,而第二步將在通過驗證后保存數據。

所以我的第一張桌子是:

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)給出了錯誤。 有什么建議嗎?

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

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

理想情況下,您還可以向視圖添加唯一約束。 好了,您可以指定唯一約束,但是不強制執行。 默認情況下,約束處於“禁用,不驗證”模式。

TABLE_NAME_TEMP是某種登台表。 在數據倉庫環境中,與最終表(在您的方案中為TABLE_NAME )相比,登台表上的約束通常更寬松。

“第一個類似於驗證步驟,第二個將在驗證通過后保存數據”

檢查TABLE_NAME_TEMP.GROUP_NAME是否不存在TABLE_NAME似乎是一個驗證步驟。 如果確實在TABLE_NAME_TEMP得到重復項,則可能要加載它們,以便可以在加載失敗的情況下進行調查(取決於將數據存入暫存表的方式)。 在需要加載最終表時,只需刪除它們或過濾它們即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM