用于在插入前检查表中重复记录的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。提问应该是提问,而不是评论。