我正在运行以下查询
IF NOT EXISTS
(SELECT TOP 1 forumViewID FROM rla.dbo.forumView WHERE fv_sessionID = 27392504 AND fv_topicID = 23971)
BEGIN
INSERT INTO rla.dbo.forumView (fv_sessionID, fv_topicID) VALUES (27392504, 23971);
END;
我有一个跨越fv_sessionID和fv_topicID的唯一索引 - 因此大多数情况下此查询按预期工作,每个会话只生成一个“视图”,但有时我会收到错误:
Violation of UNIQUE KEY constraint 'IX__forumView'. Cannot insert duplicate key in object 'dbo.forumView'.
有什么办法可以阻止这种情况,或者在这些情况下我是否需要捕捉和忽略?
答案 0 :(得分:0)
最佳做法是设置Identity
column
。它将自动处理唯一值
在这种情况下,请使用try和catch。
答案 1 :(得分:0)
正如AKA所说,fv_sessionid应该是一个标识列,以避免此错误。
如果您不想拥有标识列,请尝试以下代码安静以避免该错误。
BEGIN TRANSACTION
IF NOT EXISTS
(SELECT TOP 1 forumViewID FROM rla.dbo.forumView WHERE fv_sessionID = 27392504 AND fv_topicID = 23971)
BEGIN
INSERT INTO rla.dbo.forumView (fv_sessionID, fv_topicID) VALUES (27392504, 23971)
IF ( @@ERROR <> 0 )
ROLLBACK TRANSACTION
END
IF (@@TRANCOUNT > 0)
COMMIT TRANSACTION