检查引用同一 table 中的多个列的约束
check constraint that references multiple columns in the same table
我正在尝试向将检查三列的 DB2 数据库添加约束。我使用的 table 是一张发票 table,其中包括发票上每个订单项的开始日期结束日期数量项目价格等。我想防止在列 linestatus = RELELASED
时允许开始和结束日期为空。这是我到目前为止的更改声明。我的问题是为什么这行不通?我已验证此 table 没有所有这三项检查的任何当前实例。
alter table pluspgbtrans
add constraint start_end_notnull
Check (eip_linestatus = 'RELEASED' AND eip_endate is not null AND eip_startdate is not null)
您的 SQL 声明有效。
但是,您的逻辑有一个错误:此检查不适用 仅 如果 eip_linestatus = 'RELEASED'
。
正如所写,您的约束是断言 所有行 必须具有 eip_linestatus = 'RELEASED' AND eip_endate is not null AND eip_startdate is not null
。
因此,如果 table 中的任何行的 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
)
);
我正在尝试向将检查三列的 DB2 数据库添加约束。我使用的 table 是一张发票 table,其中包括发票上每个订单项的开始日期结束日期数量项目价格等。我想防止在列 linestatus = RELELASED
时允许开始和结束日期为空。这是我到目前为止的更改声明。我的问题是为什么这行不通?我已验证此 table 没有所有这三项检查的任何当前实例。
alter table pluspgbtrans
add constraint start_end_notnull
Check (eip_linestatus = 'RELEASED' AND eip_endate is not null AND eip_startdate is not null)
您的 SQL 声明有效。
但是,您的逻辑有一个错误:此检查不适用 仅 如果 eip_linestatus = 'RELEASED'
。
正如所写,您的约束是断言 所有行 必须具有 eip_linestatus = 'RELEASED' AND eip_endate is not null AND eip_startdate is not null
。
因此,如果 table 中的任何行的 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
)
);