【发布时间】:2014-12-19 17:52:43
【问题描述】:
假设一个名为 Mytable 的表具有两列 C1 和 C2。 我想让这两列互斥。
我的意思是,如果我在此表中这一行的一列 C1 中输入值,则 db 不应允许在 C2 中输入,反之亦然。
在任何情况下,应该允许其中一列有数据,而不是两者都有(除了 NULL 值)。
是否可以通过为此表创建触发器?
【问题讨论】:
假设一个名为 Mytable 的表具有两列 C1 和 C2。 我想让这两列互斥。
我的意思是,如果我在此表中这一行的一列 C1 中输入值,则 db 不应允许在 C2 中输入,反之亦然。
在任何情况下,应该允许其中一列有数据,而不是两者都有(除了 NULL 值)。
是否可以通过为此表创建触发器?
【问题讨论】:
ALTER TABLE mytable
ADD CONSTRAINT constraint_name CHECK (c1 is null or c2 is null)
【讨论】:
我的意思是,如果我在此表的这一行的一列 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 都有一个值”。
【讨论】: