sql trigger to stop duplicates across row

后端 未结 2 1677
悲哀的现实
悲哀的现实 2021-01-16 03:18

I have a table with multiple records:

  • User_Name ( e.g. \'TOM\')
  • Question_ID (eg \'q002\')
  • Answer (e.g. \'D\')

i

2条回答
  •  忘掉有多难
    2021-01-16 03:42

    MySql does not support INSTEAD OF triggers, which is what you'd need to use here. In SQL Server, you'd use an INSTEAD OF INSERT trigger that will fire before the insert occurs, where you can write a check for the duplicate. However, if you can avoid a trigger, why not use a Stored Routine and just check for the duplicate before inserting?

    This is, of course, if you really, really cannot use a constraint.

    Edit: Updating answer for MSSQL.

    Here's an example 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
    

    You'll obviously need to modify/simplify for your situation, but the basic context is there.

提交回复
热议问题