如果存在则插入触发器

时间:2017-10-05 09:10:12

标签: sql-server tsql sql-insert database-trigger

我在这里看了很多关于这种触发器的文章和问题,但似乎无法找到确切的答案。

希望它很快,或者我很傻......

我有这个:

ALTER TRIGGER [dbo].[JobCategoriesInsertTrigger]
ON [dbo].[JobCategories]
FOR INSERT
AS
    IF EXISTS(SELECT [name], [areaId] FROM JobCategories WHERE [name] = (SELECT [name] FROM inserted) AND [areaId] = (SELECT [areaid] FROM inserted))
    BEGIN
      RAISERROR('THIS RECORD ALREADY EXISTS', 10, 1)
      PRINT 'The record you are trying to insert already exists'
      ROLLBACK
    END

尝试不存在的插入时,我得到以下内容:

THIS RECORD ALREADY EXISTS
The record you are trying to insert already exists
Msg 3609, Level 16, State 1, Line 4
The transaction ended in the trigger. The batch has been aborted.

我的问题是,我哪里出错了? - 名字和areaid不要,存在于我正在尝试的插入中但是我被阻止了,我在那里做了一些后退吗?

非常感谢任何帮助!

编辑:

这是我的插入内容:

INSERT INTO [dbo].[JobCategories]
           ([id]
           ,[name]
           ,[description]
           ,[areaId]
           ,[enabled])
     VALUES
           (NEWID(),
           'test01',
           'testitem',
           '2C6F2293-2BBD-4E54-9709-FB9C4C0200F55',
           1)
GO

表中已有的数据示例:

id                                     name    description      areaId
D120B34D-8074-4EA1-A52D-9477C3A9DFAF    500    STAT12 EXCEPTION 954A8859-311A-4F86-80CD-4E6DC4E5103E
4B737203-6E6D-435B-9BAD-95C3B28DCCB1    501    STATIC EXCEPTION 954A8859-311A-4F86-80CD-4E6DC4E5103E
A653FADC-996B-4E6F-80F4-5C08202228E2    551    EXCEPTION 70     954A8859-311A-4F86-80CD-4E6DC4E5103E

2 个答案:

答案 0 :(得分:3)

您不必使用触发器来保证不同的行。您可以通过在表格的两列上设置unique constraint来实现此目的:

CREATE TABLE [JobCategories] 
(
     id INT IDENTITY(1,1), 
     name VARCHAR(10), 
     areaid INT
)

ALTER TABLE dbo.JobCategories
ADD CONSTRAINT uq_JobCategories UNIQUE(name, areaid);

INSERT INTO [JobCategories] (name, areaid) 
VALUES ('test1', 1), -- will work
       ('test1', 2) -- will also work

SELECT * FROM [JobCategories]

现在,尝试插入已经存在的东西:

INSERT INTO [JobCategories] (name, areaid) 
VALUES ('test1', 1) -- will fail

消息:

  

Ms 2627,Level 14,State 1,Line 17
  违反UNIQUE KEY约束'uq_JobCategories'。无法在对象'dbo.JobCategories'中插入重复键。重复键值为(test1,1)。声明已经终止。

This article by Aaron Bertrand非常好读。

答案 1 :(得分:1)

记录在执行触发器功能时已经存在。
您可以使用INSTEAD OF - 触发器来替换INSERT语句的标准操作。

但是有更好的方法可以确保不会插入重复项。
(首先是unique constraints,就像在@ RigertaDemiri的答案中已经提到的那样。)