1

我正在运行以下查询,

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'.

有什么办法可以阻止这种情况,还是在这些情况下我只需要抓住并忽略?

4

2 回答 2

0

最佳实践是 Identity这样设置的column。它将自动处理唯一值

在这种情况下,请使用 try 和 catch。

于 2013-07-23T08:24:59.800 回答
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
于 2013-07-23T09:33:36.050 回答