刚才有人帮我用下面的结构创建了一个触发器:
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;
我想做的是基本上改变用户的组,如果'Teacher'在一个注册字段中被发现。
这段代码可以很好地处理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
在插入触发器中不能这样做。
在BEFORE插入触发器中,自动增量值尚未生成。
在AFTER insert触发器中,你不能SET NEW.member_group_id
.
您可以在INSERT完成后执行UPDATE。也就是说,不是在触发器中,而是来自客户端。
或者您可以指定一个主键值,而不是依赖于自动增量。这意味着您需要一些其他的方法来生成唯一的id值。