mysql - 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
解决方案
您不能在插入触发器中执行此操作。
在 BEFORE 插入触发器中,尚未生成自动增量值。
在 AFTER 插入触发器中,您不能SET NEW.member_group_id
.
您可以在 INSERT 完成后进行更新。即不是在触发器中,而是来自客户端。
或者你可以指定一个主键值而不是依赖于自动增量。这意味着您需要其他方式来生成唯一的 id 值。
推荐阅读
- webdriver - Codeception Webdrivers - 我可以在打开页面之前设置 cookie 吗?
- javascript - Vue 3:如何使用组合 API 正确更新组件道具值?
- vue.js - Vue 3 cli-service 应用程序:当从其他组件导入带有插槽的组件时,“插槽“默认”在渲染函数之外调用”警告
- airflow - 如何以少于 1 分钟的间隔运行 dag
- c# - 从字典中指定的类型转换为 IList 类型
- amazon-s3 - s3fs 使用 $HOME/.aws 中的凭据和配置,而不是 /passwd-s3fs 文件
- javascript - Discord.js v12:错误:从扩展器函数返回的类/原型必须扩展现有结构类/原型
- angular - 升级到 Angular 13 时,安装 @angular/localize@13.0.0 会出现 babel 依赖错误
- php - 为什么我在网络活动下的 firefox 和 chrome 开发工具中看不到 file_get_contents 请求?
- java - couchbase lite join 语句返回的文档比预期的多得多