我要为我的表User
创建一个触发器,在插入新行之前检查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',因为它已被调用此存储函数/触发器的语句使用。)
我没有得到我在做错的地方。
如何编写触发器以检查正在插入的值是否已存在于用户表中?
答案 0 :(得分:3)
你正在考虑这个问题。触发器在插入之前运行。如果代码成功,则插入继续。如果您不想插入行,则需要生成错误:
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);