我對SQL Server 2008R2
工作的重複數據,我有如下表觸發防止插入兩列
ID Name date
1 XYZ 2010
2 ABC 2011
3 VBL 2010
現在我想阻止插入,如果我有一個數據,雖然該ID是不同的,但數據是目前
ID Name date
4 ABC 2011
請引導我如何寫這個觸發器。
我對SQL Server 2008R2
工作的重複數據,我有如下表觸發防止插入兩列
ID Name date
1 XYZ 2010
2 ABC 2011
3 VBL 2010
現在我想阻止插入,如果我有一個數據,雖然該ID是不同的,但數據是目前
ID Name date
4 ABC 2011
請引導我如何寫這個觸發器。
事情是這樣的:
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]
)
然後你就會做生意。
簡單的唯一約束會更好。 – Namphibian
雖然這提高了錯誤,但不能停止插入,我的問題仍然存在 – WiXXeY
噢,那是因爲我錯過了ROLLBACK行 - 所以添加一個像我剛纔一樣。但看看詹姆斯的答案,或許你所追求的是一個獨特的約束。 – Rocklan
如果您正在使用將數據插入表中的存儲過程,則不需要觸發器。你首先檢查組合是否存在,然後不要插入。
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
觸發器可能會引發錯誤,但數據仍插入表中,如何停止插入數據 – WiXXeY
試試這個
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
你並不真的需要這個觸發。只需爲多列設置一個唯一的約束。
ALTER TABLE [dbo].[TableName]
ADD CONSTRAINT [UQ_ID_Name_Date] UNIQUE NONCLUSTERED
(
[ID], [Name], [Date]
)
約束不應該只在名稱和日期列上嗎? – Rocklan
你真的需要觸發器嗎?你嘗試過獨特的索引或約束嗎? – Elmer
以及如何申請當我的主鍵是ID? – WiXXeY
CREATE UNIQUE NONCLUSTERED INDEX XXTable_Unq ON xxTable(name ASC,[date] ASC) – Elmer