SQL Server 条件 CHECK 约束

Posted

技术标签:

【中文标题】SQL Server 条件 CHECK 约束【英文标题】:SQL Server conditional CHECK constraint 【发布时间】:2011-11-10 14:13:31 【问题描述】:

我正在使用 SQL Server 2008 Management Studio。以下是我必须写的内容,第二个约束我遇到了一些困难。这让我有点困惑,我非常感谢一些帮助。

编写一个 ALTER TABLE 语句,将两个新的检查约束添加到 AP 数据库的 Invoices 表中。第一个应该允许 (1) PaymentDate 仅在 PaymentTotal 为零时为空,并且 (2) PaymentDate 只有在 PaymentTotal 大于零时才为空。第二个约束应该防止 PaymentTotal 和 CreditTotal 的总和大于 InvoiceTotal。

这是我目前所拥有的,第一个约束有效,但第二个无效(PaymentTotal 和 CreditTotal 的总和大于 InvoiceTotal)。

ALTER TABLE Invoices WITH CHECK
ADD check (
    (PaymentTotal = 0 AND PaymentDate is NULL)
    OR
    (PaymentTotal > 0 AND PaymentDate is NOT NULL)
)
ADD CHECK (
    (PaymentTotal < InvoiceTotal = SUM)
    OR
    (CreditTotal < InvoiceTotal = SUM)
)

在此先感谢您。

【问题讨论】:

第一个改变告诉你必须发生什么 【参考方案1】:

您编写了一个没有参数的聚合函数 (SUM())。

“第二个约束应该防止 PaymentTotal 和 CreditTotal 的总和大于 InvoiceTotal。”这让我有点困惑,但您应该将其更改为:

ALTER TABLE Invoices WITH CHECK 
ADD check ( 
    (PaymentTotal = 0 AND PaymentDate is NULL) 
    OR 
    (PaymentTotal > 0 AND PaymentDate is NOT NULL) 
) 
go

ALTER TABLE Invoices WITH CHECK
ADD CHECK ( 
    (PaymentTotal + CreditTotal) <= InvoiceTotal 
) 
go

【讨论】:

非常感谢您对查询的帮助。我真的很感激。再次感谢【参考方案2】:
...
ADD CHECK (
    PaymentTotal + CreditTotal <= InvoiceTotal
)

【讨论】:

以上是关于SQL Server 条件 CHECK 约束的主要内容,如果未能解决你的问题,请参考以下文章

要SQL Server 中约束字段LoginName 只能为英文字符,check 语句怎么写?哪位高手指点一下,

SQL Server创建 学号 性别 课程编号 check约束 主键约束 UNIQUE约束

SQL Server(第一章) 创建表 删除表 创建主键约束唯一约束外键约束CHECK约束默认约束

怎样在sql中创建check约束

mysql的check约束问题···

Sql Server数据库之约束