检查约束在 SQL 服务器中不起作用
Check CONSTRAINT Not work in SQL Server
我必须限制在我的 table 中插入重复数据
这里是SQL服务器Table
CREATE TABLE [dbo].[temptbl](
[id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[DSGN] [varchar](500) NULL,
[RecordType] [varchar](1000) NULL
)
我想在 RecordType 上设置条件,如果 RecordType 是 'SA' 则检查 CONSTRAINT(意味着如果 DSGN = 0 且 RecordType = 'SA' 存在,我不想插入该数据。
如果 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'
这被称为 filtered index。
您的检查约束没有像您想象的那样工作,因为当为任何特定行评估检查约束时,该行已经在 table 中可见(在该事务的上下文中)并且所以每一行都有效地阻止了它的自己的插入。
仅对新数据使用With NOCheck。这里是link提供的
https://technet.microsoft.com/en-us/library/ms179491(v=sql.105).aspx
我必须限制在我的 table 中插入重复数据
这里是SQL服务器Table
CREATE TABLE [dbo].[temptbl](
[id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[DSGN] [varchar](500) NULL,
[RecordType] [varchar](1000) NULL
)
我想在 RecordType 上设置条件,如果 RecordType 是 'SA' 则检查 CONSTRAINT(意味着如果 DSGN = 0 且 RecordType = 'SA' 存在,我不想插入该数据。
如果 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'
这被称为 filtered index。
您的检查约束没有像您想象的那样工作,因为当为任何特定行评估检查约束时,该行已经在 table 中可见(在该事务的上下文中)并且所以每一行都有效地阻止了它的自己的插入。
仅对新数据使用With NOCheck。这里是link提供的
https://technet.microsoft.com/en-us/library/ms179491(v=sql.105).aspx