Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于在插入前检查表中重复记录的Mysql触发器_Mysql_Triggers - Fatal编程技术网

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

用于在插入前检查表中重复记录的Mysql触发器,mysql,triggers,Mysql,Triggers,我将为我的表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 Mo

我将为我的表
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”,因为调用此存储函数/触发器的语句已使用该表。)

我没有达到我犯错误的地方


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

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

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);

为什么不对手机号码设置一个唯一的限制?@KP。这张桌子用了很长时间,现在我要换了。它有许多重复的手机号码,无法删除,所以我不能应用唯一约束。触发器是一个好方法吗?是的,我也有同样的想法,让移动设备独一无二,但是已经有很多重复的,我们无法删除,所以我想到了实现触发器。顺便说一句,上面的代码给出的错误是
错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在“45000”附近使用的正确语法设置MESSAGE_TEXT=“由于手机号码重复,插入失败”;“结束”在第6行
如果您希望触发器安静地忽略插入或更新(如果存在重复)而不生成任何错误,该怎么办?@PaulMan。提问应该是提问,而不是评论。