2013-08-29 113 views
9

我對SQL Server 2008R2工作的重複數據,我有如下表觸發防止插入兩列

ID  Name  date 
1  XYZ  2010 
2  ABC  2011 
3  VBL  2010 

現在我想阻止插入,如果我有一個數據,雖然該ID是不同的,但數據是目前

ID Name  date 
    4 ABC  2011 

請引導我如何寫這個觸發器。

+1

你真的需要觸發器嗎?你嘗試過獨特的索引或約束嗎? – Elmer

+0

以及如何申請當我的主鍵是ID? – WiXXeY

+2

CREATE UNIQUE NONCLUSTERED INDEX XXTable_Unq ON xxTable(name ASC,[date] ASC) – Elmer

回答

16

事情是這樣的:

CREATE TRIGGER MyTrigger ON dbo.MyTable 
AFTER INSERT 
AS 

if exists (select * from table t 
    inner join inserted i on i.name=t.name and i.date=t.date and i.id <> t.id) 
begin 
    rollback 
    RAISERROR ('Duplicate Data', 16, 1); 
end 
go 

這只是插入,你可能要考慮更新過。

更新

更簡單的方法是隻在表上創建一個唯一約束,這也將強制其更新過,並刪除了觸發的需要。只要這樣做:

ALTER TABLE [dbo].[TableName]  
ADD CONSTRAINT [UQ_ID_Name_Date] UNIQUE NONCLUSTERED 
(
    [Name], [Date] 
) 

然後你就會做生意。

+1

簡單的唯一約束會更好。 – Namphibian

+0

雖然這提高了錯誤,但不能停止插入,我的問題仍然存在 – WiXXeY

+0

噢,那是因爲我錯過了ROLLBACK行 - 所以添加一個像我剛纔一樣。但看看詹姆斯的答案,或許你所追求的是一個獨特的約束。 – Rocklan

2

如果您正在使用將數據插入表中的存儲過程,則不需要觸發器。你首先檢查組合是否存在,然後不要插入。

CREATE PROCEDURE usp_InsertData 
@Name varchar(50), 
@Date DateTime 
AS 
BEGIN 

IF (SELECT COUNT(*) FROM tblData WHERE Name = @Name AND [email protected]) = 0 
    BEGIN 
     INSERT INTO tblData 
        (Name, Date) 
      VALUES (@Name, @Date) 
     Print 'Data now added.' 
    END 
ELSE 
    BEGIN 
     Print 'Dah! already exists'; 
    END 
END 

如果您未通過存儲過程插入數據,則可以使用以下觸發器。

CREATE TRIGGER checkDuplicate ON tblData 
AFTER INSERT 
AS 

IF EXISTS (SELECT * FROM tblData A 
INNER JOIN inserted B ON B.name=A.name and A.Date=B.Date) 
BEGIN 
    RAISERROR ('Dah! already exists', 16, 1); 
END 
GO 
+1

觸發器可能會引發錯誤,但數據仍插入表中,如何停止插入數據 – WiXXeY

-3

試試這個

CREATE TRIGGER trg ON TableName 
AFTER INSERT 
AS 
    Begin 
    Declare @id int,@name varchar(10),@date DateTime 
    Declare @cnt1 int,@cnt2 int,@cnt3 int 

    INSERT INTO TableName(ID, Name, Date) VALUES(4,'ABC',2011) 
    select @id=ID,@name=Name,@date=Date from inserted 

    select @cnt2=Count(*) from TableName where [email protected] 
    select @cnt3=Count(*) from TableName where [email protected] 

    if(@cnt2>1 or @cnt3>1) 
    Rollback 
    else 
    Commit 

    end 
+0

這是充滿了錯誤,將無法正常工作。您的insert語句具有硬編碼值,並且不允許具有重複名稱或日期或ID的數據。 – Rocklan

+0

要求是不允許重複甚至不同的id,對嗎? – Kalyan

0

你並不真的需要這個觸發。只需爲多列設置一個唯一的約束。

ALTER TABLE [dbo].[TableName]  
ADD CONSTRAINT [UQ_ID_Name_Date] UNIQUE NONCLUSTERED 
(
    [ID], [Name], [Date] 
) 
+2

約束不應該只在名稱和日期列上嗎? – Rocklan