【问题标题】:Reusing CHECK CONSTRAINTS重用检查约束
【发布时间】:2010-08-31 09:58:06
【问题描述】:

在 SQL Server 中,假设一个列需要具有相同的数据类型,是否可以在表(或数据库级别)定义检查约束并在定义时将其应用于列?

在这个(人为的)示例中:

ALTER TABLE dbo.tblAuditTrail
ADD CONSTRAINT CK_DecimalNumber
CHECK (DecimalColumn LIKE '^\-?\d+\.\d+$')
GO

现在如何将它与在表级别创建它的一个或多个列相关联,或者使用 RULE viz 来解决这个问题。

CREATE RULE RU_Decimal
AS
@value LIKE '^\-?\d+\.\d+$'
GO

我知道该示例是人为设计的,人们会使用十进制列来表示十进制值,但由于设计选择不佳,假设这是一个 nchar 列,并且您想对其施加一些限制。

【问题讨论】:

    标签: sql-server constraints rules


    【解决方案1】:

    虽然规则确实满足您的要求,但现在已弃用它们,取而代之的是普通的旧检查约束。如果您认为数据库可能需要迁移到 SQL Server 的未来版本,那么使用规则不是一个好主意。请参阅 MSDN 文档顶部的“重要”消息:http://msdn.microsoft.com/en-us/library/ms188064.aspx

    您可以通过使用用户定义的函数并在所有检查约束中调用它来获得一些重用,但您仍然需要在它适用的所有列上显式定义检查约束。

    CREATE FUNCTION IsDecimal(@input varchar(max))
    RETURNS bit
    AS 
    BEGIN
        IF @value LIKE '^\-?\d+\.\d+$'
            RETURN 1
        ELSE
            RETURN 0
    END
    GO 
    
    ALTER TABLE dbo.tblAuditTrail     
        ADD CONSTRAINT CK_DecimalNumber     
        CHECK (dbo.IsDecimal(DecimalColumn) = 1)     
    GO
    

    【讨论】:

    • 丹尼尔,非常感谢。不赞成使用规则似乎很遗憾,但我想这就是 IT 生活:-) 我会采纳并调整您的建议 - 非常感谢!
    • 这可行,但标量 UDF 的性能很糟糕。
    【解决方案2】:

    您的约束是类型约束。

    使用 SQL,您可以通过用户定义的类型来处理这种情况,在这种情况下,您的“重用”通过将多个列声明为这种类型来实现,

    或者您必须将类型约束重复为每个单独列的 CHECK 约束。

    【讨论】:

    • 我认为不可能将检查约束与自定义类型相关联。当然可以使用 CLR 类型,但这通常不是一种选择,而且肯定会影响性能。
    • Erwin 我真的不这么认为,因为 UDT 所做的只是用更合适的名称或长度重新定义已经存在的类型,即:sp_addtypebirthday, datetime, 'NULL';或 sp_addtype N'CustomerName', nvarchar (20), not null
    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 2013-12-07
    • 2011-01-28
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多