【问题标题】:sql trigger to stop duplicates across rowsql触发器停止跨行重复
【发布时间】:2011-10-29 10:09:36
【问题描述】:

我有一个包含多条记录的表:

  • 用户名(例如“TOM”)
  • Question_ID(例如“q002”)
  • 答案(例如“D”)

我想创建一个触发器,这样没有人可以两次提交同一问题的答案。 它必须是一个触发器而已。

CREATE TRIGGER trigger_Check_Duplicates

ON submit_Answer

FOR INSERT
AS

IF SELECT???

PRINT 'duplicate'

raiserror('cant submit answer to same question twice')

ROLLBACK

End

【问题讨论】:

  • 您可能想解释为什么它只能是一个触发器。通常,这是由约束处理的,因此不可能被允许,而不是依靠触发器之类的机制来为您完成额外的工作。
  • @Sumo 我知道有限制并使用阻止这种情况的键,但正如问题所问的那样,我想使用触发器来做到这一点。这不是一个真正的数据库
  • 刚刚注意到这也是MySql而不是SQL Server。
  • 以防万一,您可以在 User_Name AND Question_ID 上创建 UNIQUE 索引,那么您的插入将失败,除非您指定 IGNOREON DUPLICATE 子句。
  • 但是为什么你没有完成你已经开始的那个触发器?

标签: sql sql-server tsql triggers


【解决方案1】:

MySql 不支持INSTEAD OF 触发器,这是您需要在这里使用的。在 SQL Server 中,您将使用INSTEAD OF INSERT 触发器,该触发器将在插入发生之前触发,您可以在其中编写重复检查。但是,如果您可以避免触发,为什么不使用 Stored Routine 并在插入前检查重复项?

当然,如果你真的真的不能使用约束的话。

编辑:更新 MSSQL 的答案。

这是一个例子right from MSDN

CREATE TRIGGER IO_Trig_INS_Employee ON Employee
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
-- Check for duplicate Person. If there is no duplicate, do an insert.
IF (NOT EXISTS (SELECT P.SSN
      FROM Person P, inserted I
      WHERE P.SSN = I.SSN))
   INSERT INTO Person
      SELECT SSN,Name,Address,Birthdate
      FROM inserted
ELSE
-- Log an attempt to insert duplicate Person row in PersonDuplicates table.
   INSERT INTO PersonDuplicates
      SELECT SSN,Name,Address,Birthdate,SUSER_SNAME(),GETDATE()
      FROM inserted
-- Check for duplicate Employee. If no there is duplicate, do an INSERT.
IF (NOT EXISTS (SELECT E.SSN
      FROM EmployeeTable E, inserted
      WHERE E.SSN = inserted.SSN))
   INSERT INTO EmployeeTable
      SELECT EmployeeID,SSN, Department, Salary
      FROM inserted
ELSE
--If there is a duplicate, change to UPDATE so that there will not
--be a duplicate key violation error.
   UPDATE EmployeeTable
      SET EmployeeID = I.EmployeeID,
          Department = I.Department,
          Salary = I.Salary
   FROM EmployeeTable E, inserted I
   WHERE E.SSN = I.SSN
END

您显然需要针对您的情况进行修改/简化,但基本上下文就在那里。

【讨论】:

  • 对不起,对于 SQL,使用上面的 'trigger_check_duplicates' 示例的语法是什么?
【解决方案2】:

Create trigger

CREATE TRIGGER dbo.uniqueUserQuestion 
ON dbo.submit_Answer
INSTEAD OF INSERT
AS
BEGIN
    SET NOCOUNT ON
    IF EXISTS 
    (
        SELECT 1 
        FROM dbo.submit_Answer T 
        INNER JOIN INSERTED I 
        ON T.user_name = I.user_name 
            AND T.question_id = I.question_id
    )
    BEGIN
        -- Do dupe handling here
        PRINT 'duplicate'
        raiserror('cant submit answer to same question twice')
        return
    END

    -- actually add it in
    INSERT INTO
        dbo.submit_Answer
    SELECT
        *
    FROM
        INSERTED I
END
GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2015-07-23
    相关资源
    最近更新 更多