首页 > 解决方案 > SQL - 如何使 BEFORE UPDATE 触发器作为 BEFORE INSERT 工作?

问题描述

有人刚刚帮我创建了一个具有以下结构的触发器:

CREATE TRIGGER `newTeacher` BEFORE INSERT ON `members`
FOR EACH ROW UPDATE
BEGIN
    Declare fieldInfo varchar(30);

    SELECT field_2 INTO fieldInfo 
      FROM pfields_cont 
     WHERE pfields_cont.member_id = NEW.member_ID;

    IF fieldInfo = 'Teacher' THEN
        SET NEW.member_group_id = 6;
    END IF;
END;

如果在其中一个注册字段中找到“老师”,我要做的基本上是更改用户组。

该代码适用于 BEFORE UPDATE,但不适用于 BEFORE INSERT。它不会抛出任何错误。它只是没有做任何事情。

有人告诉我这是因为 member_id 是自动递增的,并且触发器触发时它的编号是未知的。

有人可以指出我的解决方案吗?或者将其转换为过程或函数,而不是触发器?

DDL:

CREATE TABLE `members` (
  `member_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `member_group_id` smallint(6) NOT NULL DEFAULT 0,
  `email` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
...
  PRIMARY KEY (`member_id`),
  KEY `bday_day` (`bday_day`),
  KEY `ip_address` (`ip_address`),
  KEY `email` (`email`),
  KEY `member_groups` (`member_group_id`,`mgroup_others`(188))
) ENGINE=InnoDB AUTO_INCREMENT=161 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

标签: mysqldatabasetriggerssql-function

解决方案


您不能在插入触发器中执行此操作。

在 BEFORE 插入触发器中,尚未生成自动增量值。

在 AFTER 插入触发器中,您不能SET NEW.member_group_id.

您可以在 INSERT 完成后进行更新。即不是在触发器中,而是来自客户端。

或者你可以指定一个主键值而不是依赖于自动增量。这意味着您需要其他方式来生成唯一的 id 值。


推荐阅读