我有一张和这张类似的桌子
create table my_table
(
id serial,
attribute boolean,
number integer
)
有没有办法让它在列number
IFattribute
值中强制不为空true
?
因此,如果使用属性值“true”保存记录,则必须为 number 指定一个值。
编辑:经过一番挖掘后,我尝试了这个
alter table my_table
add constraint number_must_have_value CHECK (attribute = 't' and number IS NOT NULL)
它抛出约束被某些行违反,但如果我运行:
select * from my_table where attribute = 't' and number IS NOT NULL
我检索 0 行。所以我的数据似乎没问题?
无论如何,我尝试使用它来强制它
constraint number_must_have_value NOT VALID CHECK (attribute = 't' and number IS NOT NULL)
但是无法使 NOT VALID 选项起作用。我收到语法错误。它不是在正确的地方吗?
这是一个相当简单的
CHECK
约束:代码背后的逻辑是逻辑限制
if a then b
用布尔逻辑写成(not a) or (b)
. 乍一看似乎违反直觉,但如果您编写可能的布尔组合,它就会起作用。约束也可以写成
CHECK ( NOT (attribute AND number IS NULL) )
看起来更具解释性(“不允许属性为假且数字同时为空”)。选择对您来说更具可读性的内容。