【问题标题】:UNIQUE constraint on multiple columns with non-interchangeable values具有不可互换值的多列的 UNIQUE 约束
【发布时间】:2017-03-03 10:09:43
【问题描述】:

我想在 2 列 colA 和 colB 上设置 UNIQUE 约束。一旦设置了约束,它将确保 colA 和 colB 的值组合是唯一的,

还应确保,例如,

对于表中的一行,如果 colA 值为 100,colB 值为 101,则该表中任何其他行的 colA 值不能为 101,colB 值不能为 100。

请提出建议。

问候, 萨钦

【问题讨论】:

  • 是否可以强制(通过CHECKcolA 始终小于colB
  • 不,colA 并非总是小于 colB。对于表中的任何 ID,colA 和 colB 的值不能互换。如果您需要任何进一步的解释,请告诉我。虽然带有 CHECK 约束的解决方案应该是可以接受的。

标签: oracle plsql


【解决方案1】:

Checkunique index

    create table uni(colA number, colB number);

    ALTER TABLE uni ADD CONSTRAINT constraint_name  check( cola != colb);

    create unique index uni_idx on uni(  LEAST( cola , colb),GREATEST(cola , colb));

insert into uni values (100,101); (OK)
into uni values (100,102); (OK)
into uni values (101,100); (error)
into uni values (100,100); (error)

【讨论】:

  • 是的,你是对的,我忘记从索引中删除 ||
  • 如何在 WHERE 子句中检查该索引的有效性?我的意思是,SELECT * FROM uni WHERE LEAST(cola, colb) = GREATEST(cola, colb)?或其他类似的代码?
  • 但是为什么要查呢?执行插入并处理两个异常 (ORA-02290,ORA-00001)
  • 您好,由于需要,我必须检查它并通过形成自定义错误消息将其输入到单独的日志表中。
  • 处理异常并插入日志。 begin -- insert to table commit; exception when others then if sqlcode in (-2290, -1) then --insert to log table commit; else raise; end if; end;
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多