另一个 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 定义唯一约束。这不是唯一约束的工作方式。您可以执行以下操作之一:

  1. 修复数据模型。将唯一约束分布在两个 table 上表明数据模型存在问题。将所有名称放在一个 table 中,用于标识组的类型。
  2. 使用触发器。

理想情况下,您还可以向视图添加唯一约束。好吧,您 可以 指定唯一约束,但不会强制执行。默认情况下,约束处于 "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 时,只需删除它们或过滤它们。