另一个表格列的唯一约束

时间:2017-05-26 10:10:06

标签: sql oracle unique-constraint

我正在创建两个表。首先是验证步骤,而第二个将在验证通过后保存数据。

所以我的第一张桌子是:

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

我的问题是,在TABLE_NAME中,GROUP_NAME必须是唯一的。因此,我需要确保TABLE_NAME_TEMP中的GROUP_NAME不得与TABLE_NAME中的现有值匹配。我试过的方式CONSTRAINT GROUP_NAME_UNIQUE UNIQUE (TABLE_NAME.GROUP_NAME, GROUP_NAME)给出了一个错误。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您无法跨两个单独的表定义唯一约束。这不是独特约束的工作方式。您可以执行以下操作之一:

  1. 修复数据模型。对两个表分配唯一约束表明数据模型存在问题。将所有名称放在一个表中,用于标识组的类型。
  2. 使用触发器。
  3. 理想情况下,您还可以向视图添加唯一约束。好吧,你可以指定唯一约束,但不强制执行。默认情况下,约束处于“禁用,无验证”模式。

答案 1 :(得分:2)

TABLE_NAME_TEMP是某种临时表。在数据仓库环境中,临时表上的限制通常比最终表(在您的方案中为TABLE_NAME)上有更宽松的约束。

  

“首先将是验证步骤,而第二个将在验证通过后保存数据”

检查TABLE_NAME_TEMP.GROUP_NAME中不存在TABLE_NAME的值似乎是验证步骤。如果您确实在TABLE_NAME_TEMP中获得了重复项,则可能需要加载它们,以便在不加载失败的情况下调查它们(取决于您如何将数据导入登台表)。只需删除它们或在加载最终表格时过滤它们。