Mysql触发器在插入之前检查Table中的重复记录

时间:2016-05-10 10:46:31

标签: mysql triggers

我要为我的表User创建一个触发器,在插入新行之前检查User表中的重复(手机号码)。

我的用户表格结构是:

USERID | FirstName | LastName | EmailID | Mobile

我使用以下代码创建触发器

DELIMITER $$
CREATE TRIGGER Before_Insert_User
BEFORE INSERT ON User
FOR EACH ROW
BEGIN
  IF (NOT EXISTS(SELECT * FROM User WHERE Mobile = NEW.Mobile)) THEN
    INSERT INTO User (USERID, FirstName, LastName, EmailID, Mobile,) 
    VALUES (NEW.USERID, NEW.FirstName, NEW.LastName, NEW.EmailID, NEW.Mobile); 
  END IF;
END$$
DELIMITER ;

但是这个触发器在插入新记录时给出了如下错误:

  

无法更新用户信息(无法更新存储函数/触发器中的表'User',因为它已被调用此存储函数/触发器的语句使用。)

我没有得到我在做错的地方。

如何编写触发器以检查正在插入的值是否已存在于用户表中?

1 个答案:

答案 0 :(得分:3)

你正在考虑这个问题。触发器在插入之前运行。如果代码成功,则插入继续。如果您不想插入行,则需要生成错误:

DELIMITER $$

CREATE TRIGGER Before_Insert_User
BEFORE INSERT ON User
FOR EACH ROW
BEGIN
  IF (EXISTS(SELECT 1 FROM User WHERE Mobile = NEW.Mobile)) THEN
    SIGNAL SQLSTATE VALUE '45000' SET MESSAGE_TEXT = 'INSERT failed due to duplicate mobile number';
  END IF;
END$$
DELIMITER ;

但是,这是实现此约束的错误方法。您只希望Mobile在表中是唯一的,因此请使用唯一约束或索引:

alter table user add constraint unq_user_mobile unique(mobile);