我正在尝试使用 CHECK + UDF 应用自定义验证,尽管如此,它在我的情况下无法正常工作,而且在搜索后有一种观点认为这种方法可能会影响性能并且它不可靠。
T-SQL 中是否有一些现有工具可以解决我的问题?
这是我的sql:
DROP TABLE IF EXISTS dbo.test_name_uniq;
CREATE TABLE dbo.test_name_uniq (
name VARCHAR(255),
state VARCHAR(255)
)
ALTER TABLE dbo.test_name_uniq DROP CONSTRAINT IF EXISTS test_name_uniq_constraint;
DROP FUNCTION IF EXISTS dbo.validate_test_name_uniq;
GO
CREATE FUNCTION dbo.validate_test_name_uniq(@name VARCHAR(255))
RETURNS BIT
AS
BEGIN
DECLARE @unique_name BIT = 0;
SELECT @unique_name = CASE
WHEN COUNT(*) > 0
THEN 0
ELSE 1
END
FROM dbo.test_name_uniq i
WHERE i.name = @name AND i.state <> 'Removed';
RETURN @unique_name;
END;
GO
ALTER TABLE dbo.test_name_uniq
WITH NOCHECK ADD CONSTRAINT test_name_uniq_constraint CHECK (dbo.validate_test_name_uniq(name) = 1 );
GO
DELETE FROM dbo.test_name_uniq;
GO
INSERT INTO dbo.test_name_uniq (name, state) VALUES
('Test application', 'Active');
每次尝试插入行时,都会收到错误:
INSERT 语句与 CHECK 约束"test_name_uniq_constraint"冲突。冲突发生在数据库"data_local_test",表"dbo.test_name_uniq",列"name"。
您可以尝试在列name
上使用唯一过滤索引,其中state<>'Removed'
:
CREATE UNIQUE INDEX uix_name
ON dbo.test_name_uniq (name)
WHERE where state<> 'Removed';
希望对您有所帮助。