2013-07-23 43 views
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'. 

有什么做的,停止此,还是我只需要赶上并在这些情况下忽略?

回答

0

最佳做法是设定Identity这样column。它会自动处理的独特价值

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

+0

因为麻烦列是外国它不可能使用这种身份列,我已经实施了TRY/CATCH,迄今它似乎在做伎俩,所以我会接受这个答案为此原因。 –

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 
+0

为什么'fv_sessionID'是一个标识列,它是一个外键,和'fv_topicID'一样。此表可能包含查看许多主题的会话,以及许多会话查看的主题。 –

相关问题