另一个 table 列的唯一约束
Unique constraint on another table's column
我正在创建两个 table。第一个类似于验证步骤,第二个将在验证通过后保存数据。
所以我的第一个 table 是:
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)
);
和第二个table验证成功后成立:
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)
给出了一个错误。有什么建议吗?
您不能跨两个单独的 table 定义唯一约束。这不是唯一约束的工作方式。您可以执行以下操作之一:
- 修复数据模型。将唯一约束分布在两个 table 上表明数据模型存在问题。将所有名称放在一个 table 中,用于标识组的类型。
- 使用触发器。
理想情况下,您还可以向视图添加唯一约束。好吧,您 可以 指定唯一约束,但不会强制执行。默认情况下,约束处于 "disable, no validate" 模式。
TABLE_NAME_TEMP
是某种分期 table。在数据仓库环境中,对暂存 table 的约束通常比我们对最终 table 的约束更宽松(TABLE_NAME
在您的场景中)。
" first will be something like verification step, while second will hold the data after verification passed"
检查 TABLE_NAME_TEMP.GROUP_NAME
的值在 TABLE_NAME
中不存在似乎是一个验证步骤。如果您确实在 TABLE_NAME_TEMP
中得到了重复项,您可能想要加载它们,这样您就可以在加载失败的情况下调查它们(取决于您如何将数据放入分段 table)。当需要加载最终 table 时,只需删除它们或过滤它们。
我正在创建两个 table。第一个类似于验证步骤,第二个将在验证通过后保存数据。
所以我的第一个 table 是:
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)
);
和第二个table验证成功后成立:
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)
给出了一个错误。有什么建议吗?
您不能跨两个单独的 table 定义唯一约束。这不是唯一约束的工作方式。您可以执行以下操作之一:
- 修复数据模型。将唯一约束分布在两个 table 上表明数据模型存在问题。将所有名称放在一个 table 中,用于标识组的类型。
- 使用触发器。
理想情况下,您还可以向视图添加唯一约束。好吧,您 可以 指定唯一约束,但不会强制执行。默认情况下,约束处于 "disable, no validate" 模式。
TABLE_NAME_TEMP
是某种分期 table。在数据仓库环境中,对暂存 table 的约束通常比我们对最终 table 的约束更宽松(TABLE_NAME
在您的场景中)。
" first will be something like verification step, while second will hold the data after verification passed"
检查 TABLE_NAME_TEMP.GROUP_NAME
的值在 TABLE_NAME
中不存在似乎是一个验证步骤。如果您确实在 TABLE_NAME_TEMP
中得到了重复项,您可能想要加载它们,这样您就可以在加载失败的情况下调查它们(取决于您如何将数据放入分段 table)。当需要加载最终 table 时,只需删除它们或过滤它们。