2013-07-23 81 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'一樣。此表可能包含查看許多主題的會話,以及許多會話查看的主題。 –

相關問題