我正在创建两个表。首先是验证步骤,而第二个将在验证通过后保存数据。
所以我的第一张桌子是:
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)
给出了一个错误。有什么建议吗?
答案 0 :(得分:2)
您无法跨两个单独的表定义唯一约束。这不是独特约束的工作方式。您可以执行以下操作之一:
理想情况下,您还可以向视图添加唯一约束。好吧,你可以指定唯一约束,但不强制执行。默认情况下,约束处于“禁用,无验证”模式。
答案 1 :(得分:2)
TABLE_NAME_TEMP
是某种临时表。在数据仓库环境中,临时表上的限制通常比最终表(在您的方案中为TABLE_NAME
)上有更宽松的约束。
“首先将是验证步骤,而第二个将在验证通过后保存数据”
检查TABLE_NAME_TEMP.GROUP_NAME
中不存在TABLE_NAME
的值似乎是验证步骤。如果您确实在TABLE_NAME_TEMP
中获得了重复项,则可能需要加载它们,以便在不加载失败的情况下调查它们(取决于您如何将数据导入登台表)。只需删除它们或在加载最终表格时过滤它们。