Mysql触发器用于在插入前检查表中的重复记录
Posted
技术标签:
【中文标题】Mysql触发器用于在插入前检查表中的重复记录【英文标题】:Mysql trigger for checking duplicate record in Table before insert 【发布时间】:2016-05-10 10:46:30 【问题描述】:我要为我的表 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 ;
但是这个触发器在插入新记录时给了我如下错误:
无法更新用户信息(无法更新存储函数/触发器中的表“用户”,因为它已被调用此存储函数/触发器的语句使用。)
我没有找到我做错的地方。
如何编写触发器来检查正在插入的值是否已存在于用户表中?
【问题讨论】:
为什么不对手机号码设置唯一限制? @KP。这张桌子用了很长时间,现在我正在更换它。它存在许多无法删除的重复手机号码,因此我无法应用唯一约束。触发是好方法吗? 【参考方案1】:您正在倒退。触发器在插入之前运行。如果代码成功,则插入继续进行。如果您不想插入该行,则需要生成错误:
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);
【讨论】:
是的,我有相同的想法让移动设备独一无二,但是已经存在许多重复项,我们无法删除,所以我想到了实现触发器。顺便说一句,上面的代码给出了错误Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near ''45000' SET MESSAGE_TEXT = 'INSERT failed due to duplicate mobile number'; END' at line 6
如果你想让触发器安静地忽略插入或更新,如果有重复并且不产生任何错误呢?
@PaulMan 。 . .问题应该作为问题提出,而不是 cmets。
@PaulMan 您应该使用存储过程来防止插入,因为一旦执行插入查询,那么防止插入的唯一方法就是 SQL 错误/信号。以上是关于Mysql触发器用于在插入前检查表中的重复记录的主要内容,如果未能解决你的问题,请参考以下文章
使用php脚本检查一个表中的重复记录并重复记录插入到另一个表中
MySQL 当记录不存在时插入(insert if not exists)