Sql-Server

SQL Server 重複數據刪除觸發器

  • November 25, 2014

我有一個包含國家、城市、位置、描述列的表。由於描述欄位的大小,不可能將四個欄位綁定到一個複合鍵中以防止重複。我一直試圖通過觸發器來防止重複,但無論我嘗試什麼,它都會回滾每個插入,包括唯一數據的插入。

IF Exists ( Select      a.*
           From        [dbo].[Table] a
               JOIN    Inserted b
                   on  a.Country = b.Country
                   and a.City = b.City
                   and a.Location = b.Location
                   and ltrim(rtrim(a.Description)) = ltrim(rtrim(b.Description))
           )


   BEGIN
       Raiserror   ('The description that you are trying to load already exists.', 16, 1)
       Rollback 
   END

有沒有人知道上面有什麼問題,我需要做些什麼改變才能讓它只回滾重複的插入?

我懷疑您正在使用AFTER INSERT觸發器(如果您沒有指定其他觸發器是AFTER類型,請提供觸發器定義的完整程式碼以確保我們確定)所以這是預期的:您的觸發器插入後觸發,因此它將始終查看您剛剛放入的行。

而不是IF EXISTS ...您可以這樣做IF (SELECT COUNT(*) ...) > 1,這將檢查您的新行是否使總數超過一個。

您也可以使用INSTEAD OF INSERT效率更高的觸發器(做的工作比以後回滾的工作少),儘管我懷疑差異會很大,除非您在該表上有大量重複的插入工作量很大*。*

兩個方面:

首先確保你也處理,UPDATES否則你也可能以這種方式得到重複。

其次,確保您所做的事情實際上是值得的:試圖在諸如“描述”之類的自由文本輸入欄位上強制執行數據完整性通常是一個失敗的原因。除了一個有雙倍空格或拼寫錯誤之外,您可能有兩個相同的條目,並且您的檢查不會將它們選為等效項。

引用自:https://dba.stackexchange.com/questions/83558