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触发器用于在插入前检查表中的重复记录的主要内容,如果未能解决你的问题,请参考以下文章

sql插入的操作

检查oracle表单多记录块中的重复值

使用php脚本检查一个表中的重复记录并重复记录插入到另一个表中

MySQL 当记录不存在时插入(insert if not exists)

如何在插入 MySQL 之前检查表中是不是存在名称 [重复]

Oracle - 在插入前触发检查约束