自动更新(或插入)列字段的MySQL触发器
我有一个可以运行的SQL查询,如下所示:自动更新(或插入)列字段的MySQL触发器,mysql,sql,Mysql,Sql,我有一个可以运行的SQL查询,如下所示: SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 1), ' ', -1) AS first_name, If( length(name) - length(replace(name, ' ', ''))>1, SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 2), ' ', -1) ,NULL) as m
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 1), ' ', -1) AS first_name,
If( length(name) - length(replace(name, ' ', ''))>1,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 2), ' ', -1) ,NULL)
as middle_name,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 3), ' ', -1) AS last_name
FROM people
虽然将完整的名称
拆分为名字
,中间名
,和姓氏
效果很好,但我需要一种自动完成的方法;无法在每次添加人员时进入并运行查询并手动更新表
我曾尝试以触发器的形式处理此查询,但不断出现错误,通常错误状态为“不允许从触发器返回结果集”
在插入前触发器中,使用限定符
NEW.
引用分配给插入行的列的值。例如,NEW.col
将引用为列col
提供的值
将值(或表达式)指定给NEW.col
,以替换为列col
提供的值,并将插入指定的值
完成类似于SELECT语句的操作的触发器如下所示:
DELIMITER $$
CREATE TRIGGER mytrigger
BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
SET NEW.first_name = SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.name, ' ', 1), ' ', -1);
SET NEW.last_name = SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.name, ' ', 3), ' ', -1);
SET NEW.middle_name = IF(LENGTH( NEW.name) - LENGTH(REPLACE( NEW.name, ' ', ''))>1
,SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.name, ' ', 2), ' ', -1)
,NULL);
END$$
DELIMITER ;
您得到的错误是:
Error: 1415 SQLSTATE: 0A000 (ER_SP_NO_RETSET)
Message: Not allowed to return a result set from a %s
是由于一个适用于
功能
和触发器
的文件限制。(此限制也适用于从函数或触发器上下文调用的过程)可能的@jzg.dev副本:我没有对此进行任何测试,我只是复制了SELECT语句中的表达式,并给出了插入前触发器的示例。(如果要保持这些列“同步”),您将需要考虑是否需要相应的<代码>,如果保持这些列“同步”是重要的。在<代码> >更新< /COD>触发器之前,列的当前值可通过符合<代码>旧> < /COD>来获得,例如“代码>如果(NEW.col OLD.col)
将新值与现有值进行比较。