2015-04-15 29 views
-1

我已經創建了此過程用於將數據插入數據庫,這是工作正常。現在我想創建一個防止插入重複行的觸發器。我使用的是SQL Server 2008中爲此程序觸發

ALTER PROCEDURE [dbo].[AddEmployee] 
    @Stu_id nvarchar(50), 
    @Status int, 
    @Time nvarchar(50), 
    @Date nvarchar(50), 
    @Sub_id nvarchar(50) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    INSERT INTO Attendanc (Stu_id, Status, Timing, Dates, Sub_id) 
    VALUES (@Stu_id, @Status, @Time, @Date, @Sub_id) 
END 
+0

您應該提供您試圖獲得所需內容的內容。正如你沒有,這個網站似乎沒有主題。 – ZygD

+0

我想這是第一次,所以,我不知道如何創建觸發器。 – user2747666

+0

我已經爲此問題添加了相應的標籤,但我同意@ZygD表示您的問題中沒有足夠的信息來顯示*您爲這個實際問題*所嘗試的內容。 – TZHX

回答

1

正如評論所說,觸發是不是你想要做這份工作的合適的工具。爲防止表中出現重複數據,您應該在不應重複的列上添加unique constraint

另一種選擇是添加unique index而不是唯一的約束。這對優化選擇語句很有用,但可能會對更新或插入數據造成不良影響。

添加唯一約束或索引後,任何嘗試將重複數據插入這些列都會導致sql server發出錯誤。
注意:如果更新結果將導致這些列有重複數據,您也將無法更新行。

那麼你如何避免這些錯誤?
你插入數據前添加一個檢查到你的過程 - 這樣的事情:

-- Assuming the unique constraint is on columns Status and Sub_id 
IF NOT EXISTS(SELECT 1 FROM Attendanc WHERE Status = @Status AND Sub_id = @Sub_id) 
BEGIN 
    INSERT INTO Attendanc (Stu_id, Status, Timing, Dates, Sub_id) 
END 

Update語句可以是一個小麻煩來檢查,但仍有可能(這裏有一個簡單的例子):

-- Still assuming the unique constraint is on columns Status and Sub_id 
UPDATE A 
SET A.Status = @Status 
FROM Attendanc A INNER JOIN Attendanc B ON(A.Sub_id = B.Sub_id) 
WHERE A.Stu_id = @Stu_id 
AND B.Status <> @Status 

只有在該值不會違反多列唯一約束條件時纔會更新狀態列(在Status和Sub_Id上)