使用唯一索引安全地插入值

时间:2013-07-23 08:21:44

标签: sql-server

我正在运行以下查询

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

有什么办法可以阻止这种情况,或者在这些情况下我是否需要捕捉和忽略?

2 个答案:

答案 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
相关问题