如何创建触发器以验证记录是否不存在?

时间:2016-04-10 09:36:01

标签: mysql

我正在使用mysql的5.5.47版(Ubuntu)。我尝试在插入表之前创建一个触发器来检查。我的想法是:如果LoginName列的值和Email列的值存在,则插入新记录将无法实施。

表:

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 ;

我这样做了:

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;

错误:

  

MySQL说:文档

     

1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以获得正确的语法

     

靠近' NEW.LoginName不在(               选择 *               来自MemberProfile AS'在第4行

在我看来,NEW。[columns]是插入操作的参数。我不确切地知道这一点。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您不需要触发器。您可以将此功能实现为唯一键约束:

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

一旦到位,尝试插入具有重复登录名和电子邮件地址的行将产生错误:

ERROR 1062 (23000): Duplicate entry 'username-test@example.com' for key 'username_email'

(顺便说一下:请记住,这个约束仍然允许多个用户使用相同的用户名或同一个电子邮件存在 - 只是不能同时存在。这可能不是一个好主意。)