sortinggger SQL pour arrêter les duplicates sur la ligne

J'ai une table avec plusieurs loggings:

  • Nom d'user (par exemple, "TOM")
  • Question_ID (par exemple, 'q002')
  • Réponse (par exemple «D»)

Je veux créer un triggersur afin que personne ne puisse répondre deux fois à la même question. Ce doit être un triggersur seulement.

CREATE TRIGGER sortinggger_Check_Duplicates ON submit_Answer FOR INSERT AS IF SELECT??? PRINT 'duplicate' raiserror('cant submit answer to same question twice') ROLLBACK End 

Créer un triggersur

 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 

MySQL ne prend pas en charge les triggersurs INSTEAD OF , ce que vous devez utiliser ici. Dans SQL Server, vous utiliseriez un triggersur INSTEAD OF INSERT qui se triggersra avant que l'insertion se produise, où vous pouvez écrire une vérification pour le doublon. Cependant, si vous pouvez éviter un triggersur, pourquoi ne pas utiliser une routine stockée et juste vérifier la copy avant de l'insert?

C'est, bien sûr, si vous ne pouvez vraiment, vraiment pas utiliser une contrainte.

Edit: Mise à jour de la réponse pour MSSQL.

Voici un exemple à partir de 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 

Vous devrez évidemment modifier / simplifier votre situation, mais le context de base est là.