2016-04-10 12 views
-1

mysql'in 5.5.47 sürümünü (Ubuntu) kullanıyorum. Masaya yerleştirmeden önce kontrol etmek için bir tetikleyici oluşturmaya çalışıyorum. Benim fikrim: LoginName sütun değeri ve Email sütun değeri varsa, yeni bir kayıt eklenmeyecek.Bir kaydın bulunup bulunmadığını doğrulamak için tetikleyici nasıl oluşturulur?

Tablo: Yaptığım

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 ; 

bu:

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; 

hatası:. Bence, YENİ yılında

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

[colu mns] ekleme eyleminden bir argümandır. Ben tam olarak bunu bilmiyorum. Biri yardım edebilir mi?

+0

neden oldu. gönderim negatived? – Loint

cevap

0

Bunun için tetiklemeye ihtiyacınız yoktur. (

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

: hata verirler yinelenen giriş adı ve e-posta adresine sahip bir satır eklemek için çalışırken, bu yerleştirildikten sonra

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

: Bir benzersiz bir anahtar kısıtı olarak işlevleri uygulayabilirsiniz . bir kenara gibi: unutmayın bu kısıtlamasının yine birden fazla kullanıcı aynı kullanıcı adı veya aynı e-posta ile mevcut sağlayacak - sadece ikisini aynı anda bu olmayabilir harika bir fikir)

+0

Bu işe yarıyor! 2 koşulda 1'i (veya kullanıcı adı veya e-posta adresi var) kontrol edersem, '(NEW.username = OLD.username veya NEW.Email = OLD.Email)' gibi bir tetikleyici oluşturmam gerekecek mi? – Loint

+0

@ Ntlzz93 Hayır, bunun için de bir tetiklemeye ihtiyacınız yok. Sadece iki benzersiz dizin oluşturun: biri "LoginName", diğeri "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

bozuk biçim kodu ve hatası – Loint

İlgili konular