Mysql触发器用于在插入前检查表中的重复记录

San*_*eep 2 mysql triggers

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

我的用户表结构是:

USERID | FirstName | LastName | EmailID | Mobile
Run Code Online (Sandbox Code Playgroud)

我正在使用下面的代码来创建触发器

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 ;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Gor*_*off 8

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

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 ;
Run Code Online (Sandbox Code Playgroud)

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

alter table user add constraint unq_user_mobile unique(mobile);
Run Code Online (Sandbox Code Playgroud)