【问题标题】:Oracle db unique constraint design consultantOracle db唯一约束设计顾问
【发布时间】:2014-08-03 08:09:13
【问题描述】:

我有 3 张桌子:A、B、C。 A 由 D 列组成。 B 由 E、F、G、H、I、J 列组成(PK 为 J)。 C 由表 B 的外键 K 组成。

现在我需要 F,G,H 唯一,但如果 G 为空,则 F,H 唯一,I 和 E 唯一。 (和 G XOR I 必须为空)。 有没有办法可以在 db 中而不是以编程方式完成?

谢谢。

【问题讨论】:

    标签: database oracle conditional unique-constraint


    【解决方案1】:

    我很确定您可以使用唯一索引来做到这一点,并且 NULL 被忽略作为唯一索引这一事实。

    首先,在 F、G 和 H 上创建索引:

    create unique index idx_b_f_g_h on b(f, g, h)
    

    这处理“F、G、H 唯一”的情况。要处理“G 为空,则 F,H 唯一”,请执行以下操作:

    create unique index idx_b_f_h_j on b(f, h, (case when G is null then 0 else j end));
    

    这会用主键替换 G 的非 NULL 值——确保唯一性。当G 为空时,它使用任意“常量”值。 (注意常量应该与主键的类型相同。)

    要处理,I和E唯一,也可以使用函数索引。我想你的意思是:

    create unique index idx_b_i_e_j on b(coalesce(i, e));
    

    您可以使用检查约束来处理 ieNULL 的事实。

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      相关资源
      最近更新 更多