如何制作一个不允许重复数据的触发器?

时间:2016-12-08 12:48:09

标签: sql sql-server sql-server-2008 tsql

有必要在任何领域添加一条独特的线。 我写这个:

alter trigger Triger1
on Week_Schedule for insert
as
    if @@ROWCOUNT=1
begin
    if exists (
        select *
        from inserted as i, Week_Schedule as w
        where i.Week_Number = w.Week_Number 
    )
    begin
        rollback tran
        print 'Week number already exists!'
    end
end

但出了点问题。通过添加一个独特的行,会弹出一个带有触发器文本的警告。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

无需检查@@ROWCOUNT。您已使用inserted正确编写了逻辑,因此您不需要像这样的一些奇怪的解决方法。

如果我理解正确,只需将触发器的主体封装在begin / end块中:

alter trigger Triger1
on Week_Schedule for insert
as
begin
    if exists (select 1
               from inserted i join
                    Week_Schedule w
                    on i.Week_Number = w.Week_Number 
             )
    begin
        rollback tran
        print 'Неделя с таким номером уже существует!'
    end;
end;

然后,您可以在begin / end块中添加其他语句。

编辑:

如评论中所述,上述内容将回滚所有插入内容(而不是原始问题中的单行内容)。

我强烈怀疑OPs问题的真正解决方案是外键,唯一和可能检查约束的某种组合。但是,这将是另一个问题的答案,我鼓励OP提出这个问题。

答案 1 :(得分:0)

正如评论中所提到的,您应该考虑一个独特的约束。触发器可能会导致许多意外后果,并且对于这种特殊情况来说是不必要的开销。

ALTER TABLE dbo.Week_Schedule 
ADD CONSTRAINT YOURCONSTRAINTNAMEHERE UNIQUE (Week_number)