检查约束在SQL Server中不起作用
我必须限制在有条件的表中插入重复数据 这是SQL Server表检查约束在SQL Server中不起作用,sql,sql-server-2008-r2,sql-server-2012,Sql,Sql Server 2008 R2,Sql Server 2012,我必须限制在有条件的表中插入重复数据 这是SQL Server表 CREATE TABLE [dbo].[temptbl]( [id] [numeric](18, 0) IDENTITY(1,1) NOT NULL, [DSGN] [varchar](500) NULL, [RecordType] [varchar](1000) NULL ) 如果RecordType为'SA'而非check CONSTRAINT(意味着如果DSGN=0且RecordType='SA'存
CREATE TABLE [dbo].[temptbl](
[id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[DSGN] [varchar](500) NULL,
[RecordType] [varchar](1000) NULL
)
如果RecordType为'SA'而非check CONSTRAINT(意味着如果DSGN=0且RecordType='SA'存在,则我不想插入该数据),我想对RecordType设置条件
如果DSGN=1且RecordType='SA'不存在,则我希望插入该数据
如果RecordType不是“SA”,请插入任何数据
为此,我创建了约束,但它不起作用
ALTER TABLE temptbl WITH CHECK ADD CONSTRAINT chk_Stuff CHECK (([dbo].[chk_Ints]([DSGN],[RecordType])=(0)))
GO
ALTER FUNCTION [dbo].[chk_Ints](@Int_1 int,@Int_2 varchar(20))
RETURNS int
AS
BEGIN
DECLARE @Result INT
BEGIN
IF @Int_2 = 'SA'
BEGIN
IF NOT EXISTS (SELECT * FROM [temptbl] WHERE DSGN = @Int_1 AND RecordType = @Int_2)
BEGIN
SET @Result = 0
END
ELSE
BEGIN
SET @Result = 1
END
END
ELSE
BEGIN
SET @Result = 0
END
END
RETURN @Result
END
但它不起作用。请建议我放弃函数和检查约束:
CREATE UNIQUE INDEX IX_temptbl_SA ON temptbl (DSGN) WHERE RecordType='SA'
这就是我们所知道的
您的检查约束没有按预期工作,因为当为任何特定行计算检查约束时,该行在表中(在该事务的上下文中)已经可见因此,每一行都有效地阻止了自己的插入。仅对新数据使用带有NOCheck的
是的,SA行必须具有唯一的DSGN感谢您的正确答案。但我有一个疑问…这些行是否可以在现有表上工作?我的意思是,从现在起,我必须防止这种情况发生。我必须保持旧记录不变。@Hiren使用NOCheck仅用于新数据。这里是提供的链接。您好,Valutah,这是对Hiren 2月23日评论问题的回答。我当时不能发表我的评论,因为名声不好。希望你理解我为什么要回答这个问题。我在这里再次重复海伦的评论“谢谢你的正确答案。但我有一个疑问……这些能在现有的桌子上工作吗?我的意思是,从现在起我必须防止这种情况。我必须保持旧记录不变。”——Hiren gardhariya 2月23日。