我正在尝试向将检查三列的DB2数据库添加约束。我正在使用一张表作为发票表,其中包括发票上每个行项目的开始日期结束日期数量项目价格等。我希望阻止在列linestatus = RELELASED
时允许开始日期和结束日期为空。这是我到目前为止的alter语句。我的问题是为什么这不起作用?我已经验证此表没有所有这三个检查的任何当前实例。
alter table pluspgbtrans
add constraint start_end_notnull
Check (eip_linestatus = 'RELEASED' AND eip_endate is not null AND eip_startdate is not null)
答案 0 :(得分:0)
您的SQL语句有效。
但是,您的逻辑有错误:如果eip_linestatus = 'RELEASED'
,此检查仅适用于 。
正如所写,您的约束声明所有行必须具有eip_linestatus = 'RELEASED' AND eip_endate is not null AND eip_startdate is not null
。
因此,如果表中的任何行的eip_linestatus
值不是RELEASED
,则在尝试添加约束时会出现SQL0544N错误。
要创建您正在寻找的约束,您需要处理eip_linestatus
的其他状态。我无法猜测它们是什么,所以这是一个潜在的通用选项:
alter table pluspgbtrans
add constraint start_end_notnull check (
(eip_linestatus <> 'RELEASED')
OR
(
eip_linestatus = 'RELEASED'
AND eip_endate is not null
AND eip_startdate is not null
)
);