我在 SQL Server 中有一个 SP,它每分钟运行数百次,需要根据数据库检查传入流量。目前它执行以下操作
INSERT INTO table
SELECT @value1,@value2 WHERE NOT EXISTS
(SELECT * FROM table WHERE value1 = @value1 AND value2 = @value2);
不过,我也可以选择
IF NOT EXISTS(SELECT * FROM table WHERE value1 = @value1 AND value2 = @value2)
INSERT INTO table (value1,value2) VALUES (@value1,@value2);
哪个会更快?我感觉它们之间没有太大区别,但我历来不太擅长 TSQL...=/
更新:哎呀...意思是说 EXISTS 使用超过 1 个值来查找记录是否存在,因此唯一约束不起作用。编辑示例以反映...
两种变体都是不正确的。您将插入成对的重复@value1、@value2、保证.
处理这个问题的正确方法是对two列并始终插入并处理约束违规:
ALTER TABLE Table ADD CONSTRAINT uniqueValue1Value UNIQUE (value1, values2);
并插入:
BEGIN TRY
INSERT INTO Table (value1, value2) VALUES (@value1, @value2);
END TRY
BEGIN CATCH
DECLARE @error_number int, @error_message NVARCHAR(4000), @xact_state INT;
SET @error_number = ERROR_NUMBER();
SET @error_message = ERROR_MESSAGE();
SET @xact_state = XACT_STATE();
IF (@xact_state = -1)
BEGIN
ROLLBACK TRANSACTION;
END
IF (@error_number != 2627) /* 2627 is ' Cannot insert duplicate key in object ...' */
BEGIN
RAISERROR(N'Error inserting into Table: %i %s', 16,1, @errror_number, @error_message);
END
ENd CATCH
虽然这些看起来很复杂,但必须考虑一个名为正确性。与基于锁定提示的解决方案相比,这要简单得多。这也是性能最高的解决方案:仅进行一次查找。所有其他解决方案至少需要两次查找(一次用于验证是否可以插入,一次用于插入)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)