【问题标题】:Oracle Columns mutually exclusiveOracle 列互斥
【发布时间】:2014-12-19 17:52:43
【问题描述】:

假设一个名为 Mytable 的表具有两列 C1 和 C2。 我想让这两列互斥。

我的意思是,如果我在此表中这一行的一列 C1 中输入值,则 db 不应允许在 C2 中输入,反之亦然。

在任何情况下,应该允许其中一列有数据,而不是两者都有(除了 NULL 值)。

是否可以通过为此表创建触发器?

【问题讨论】:

    标签: oracle triggers


    【解决方案1】:
    ALTER TABLE mytable
    ADD CONSTRAINT constraint_name CHECK (c1 is null or c2 is null)
    

    【讨论】:

    • 这样我就可以在两列中插入数据。我只想在其中一列中包含数据,而不是两者。就像如果 C1 有数据,那么永远不应该允许 C2 插入/更新数据。如果 C2 有数据,则绝不应允许 C1 插入/更新数据。如果两者都是NULL,那很好。
    【解决方案2】:

    我的意思是,如果我在此表的这一行的一列 C1 中输入值,则 db 不应允许在 C2 中输入值,反之亦然。 在任何情况下,应该允许其中一列有数据,而不是两者都有(除了 NULL 值)。

    可能是这样的?

    ALTER TABLE mytable
    ADD CONSTRAINT constraint_name CHECK ((c1 is null and c2 is null) or
                                          (c1 is not null and c2 is null) or
                                          (c1 is null and c2 is not null))
    

    使用Karnaugh map 或简单的逻辑,您可以将其重写为:

    ALTER TABLE mytable
    ADD CONSTRAINT constraint_name CHECK (not (c1 is not null and c2 is not null))
    

    这是一个事实,说明唯一的无效组合是“对 c1 和 c2 都有一个值”

    【讨论】:

    • 感谢 Sylvain 和 Juergen,这很有帮助 :)
    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2021-02-03
    相关资源
    最近更新 更多