2016-04-10 6 views
-1

Ich benutze Version 5.5.47 (Ubuntu) von mysql. Ich versuche einen Trigger zu erstellen, der vor dem Einfügen in die Tabelle überprüft wird. Meine Idee ist: Wenn Wert von LoginName Spalte und Wert von Email Spalte existiert, einfügen einen neuen Datensatz wird nicht implementiert werden.Wie erstellt man einen Trigger, um zu überprüfen, ob ein Datensatz nicht existiert?

Tabelle:

CREATE TABLE IF NOT EXISTS `MemberProfile` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `LoginName` varchar(255) NOT NULL, 
    `Password` varchar(255) NOT NULL, 
    `FirstName` varchar(255) DEFAULT NULL, 
    `LastName` varchar(255) DEFAULT NULL, 
    `Email` varchar(255) DEFAULT NULL, 
    `Birthday` date DEFAULT NULL, 
    `Gender` int(11) DEFAULT NULL COMMENT '1: nam , 2 nu', 
    `Address` varchar(255) DEFAULT NULL, 
    `ProfileID` text, 
    `ProfileURL` text, 
    `AvatarImageURL` text, 
    `CoverImageURL` text, 
    `ActiveTime` datetime NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ; 

ich dies getan haben:

CREATE TRIGGER verifyExists BEFORE INSERT ON MemberProfile 
    FOR EACH ROW 
    BEGIN 
     IF NEW.Email,NEW.LoginName not in (
      select * 
      From MemberProfile AS A 
      where (NEW.LoginName = A.LoginName and NEW.Email = A.Email) 
     ) THEN 
      CALL `Insert not allowed`; 

     END IF; 
    END; 

Fehler.

MySQL said: Documentation

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use

near 'NEW.LoginName not in ( select * From MemberProfile AS ' at line 4

Meiner Meinung nach, NEU [colu mns] ist ein Argument der Einfügeaktion. Ich weiß es nicht genau. Kann jemand helfen?

+0

warum war.. mein Post negativ? – Loint

Antwort

0

Sie brauchen hierfür keinen Trigger. Sie können diese Funktionalität als eindeutige Schlüsseleinschränkung implementieren:

CREATE UNIQUE INDEX username_email ON MemberProfile (LoginName, Email); 

Sobald diese an Ort und Stelle ist, die Adresse eine Zeile mit einem doppelten Login-Namen und E-Mail einzufügen versucht, einen Fehler ergeben:

ERROR 1062 (23000): Duplicate entry '[email protected]' for key 'username_email' 

(als Nebenwirkung: Denken Sie daran, immer noch diese Einschränkung mehrere Benutzer erlauben, mit dem gleichen Benutzernamen existieren, oder die gleiche E-Mail - nur nicht beide auf einmal Dies kann eine große Idee nicht sein)

+0

Das funktioniert !. Wenn ich 1 in 2 Bedingungen überprüfe (oder Benutzername oder E-Mail existiert), muss ich einen Trigger wie '(NEW.username = OLD.username oder NEW.Email = OLD.Email)' erstellen. – Loint

+0

@ Ntlzz93 Nein, du brauchst dafür auch keinen Trigger. Erstellen Sie einfach zwei eindeutige Indizes: einen auf "LoginName", den anderen auf "Email". – duskwuff

0
DECLARE @Email varchar(255), 
DECLARE @LoginName varchar(255), 
SELECT @Email= INSERTED.Email FROM INSERTED 
SELECT @LoginName = INSERTED.LoginName FROM INSERTED 
IF @Email,@LoginName not in (
    select * 
    From MemberProfile AS A 
    where (@LoginName = A.LoginName and @Email = A.Email) 
) THEN 
    CALL `Insert not allowed`; 
END IF; 
END; 
+0

schlechter Formatcode und Fehler – Loint

Verwandte Themen