检查约束不允许我添加数据

Posted

技术标签:

【中文标题】检查约束不允许我添加数据【英文标题】:Check constraint not allowing me to add data 【发布时间】:2019-10-23 13:49:52 【问题描述】:

我有一个返回 BIT 的用户定义函数。

1 - 如果日期重叠 0 - 如果日期不重叠

我已经测试了 UDF,它似乎运行正常。

这是我添加的以下检查约束:

ALTER TABLE [Gizmo] WITH CHECK ADD CONSTRAINT [CK_DateOverlap]
CHECK [dbo].[MyUserFunction]([GizmoName],[GizmoState],[BeginDate],[EndDate]) = 0;

该表中没有任何数据。当我去插入一条新记录时,我得到了错误

The INSERT statement conflicted with the CHECK constraint

我手动调用 UDF 进行测试,它返回 0。

如果 UDF 返回 0,我希望约束添加记录。如果它返回 1,我不想添加它。

我错过了什么?

编辑 - UDF

ALTER FUNCTION [dbo].[MyUserFunction]
(
     @GizmoName AS VARCHAR(max),
     @GizmoState AS VARCHAR(max),
     @BeginDate AS DATETIME,
     @EndDate AS DATETIME

)

RETURNS BIT
AS
BEGIN
       DECLARE @Result BIT
       IF EXISTS(
                    SELECT *
                    FROM Gizmos
                    WHERE (@GizmoName = Name AND @GizmoState = [State])
                    AND (@EndDate >= EffectiveFrom AND EffectiveTo >= @BeginDate)
                    )
                    BEGIN
                        SET @Result = 1;
                    END
                    ELSE
                    BEGIN
                           SET @Result = 0;   
                    END
       RETURN @Result
END

插入

INSERT INTO Gizmos VALUES('XXX', 'CA', '1/1/2019', '12/31/2019');

【问题讨论】:

我对检查约束不太熟悉,但检查关键字后面的整个语句不应该在括号内吗? 好吧,UDF 还接受另外两个参数,GizmoNameGizmoState。这另外两个输入是否有可能决定位输出? @ArloGuthrie 也许,但是 OP 正在为检查约束调用 UDF,所以您 do 看到的括号实际上可能属于那里。 我们能看到 UDF 吗?可能存在一些问题,因为表中实际上没有数据可以检查重叠 请至少提供 UDF 和您尝试插入的值。只要我们知道数据类型,缩短的表定义会有所帮助,但并不重要。 【参考方案1】:

该行已插入到表中,并且约束已应用于表。所以数据已经可用,函数返回 1 并且事务被回滚。所以我们需要忽略第一行,然后它会按您的预期工作。

CREATE OR ALTER FUNCTION [dbo].[MyUserFunction]
(
     @GizmoName AS VARCHAR(max),
     @GizmoState AS VARCHAR(max),
     @BeginDate AS DATETIME,
     @EndDate AS DATETIME

)

RETURNS BIT
AS
BEGIN
       DECLARE @Result BIT

       IF (SELECT COUNT(Name)
                    FROM Gizmos
                    WHERE (@GizmoName = Name AND @GizmoState = [State])
                    AND (@EndDate >= EffectiveFrom AND EffectiveTo >= @BeginDate)
                    ) > 1
                    BEGIN
                        SET @Result = 1;
                    END
                    ELSE
                    BEGIN
                           SET @Result = 0;   
                    END

                    RETURN @Result

END
GO

【讨论】:

以上是关于检查约束不允许我添加数据的主要内容,如果未能解决你的问题,请参考以下文章

使用SQL语句向已有数据表添加约束

ORM:续集:为两列添加不相等的约束

10约束

T_SQL 语句想已有数据表添加约束

是否可以添加一个在不同数据库中调用用户定义函数的检查约束?

Oracle SQL 检查存在约束