首页 > 解决方案 > 在插入 MariaDB 触发器之前不起作用

问题描述

我需要用 created(TIMESTAMP) 和 id(AUTOINCREMENT) 数据填充 cod_unico 列,我不能用 php 来完成,因为其他两列是在 MariaDB 中生成的,并且显然不想改变它,所以我尝试了之后插入触发器更新,但我收到此错误错误:无法更新存储函数/触发器中的表“usuarios”,因为它已被调用此存储函数/触发器的语句使用。

我在插入触发器之前尝试了这段代码


    DROP TRIGGER IF EXISTS `agregar_cod_unico`;
    CREATE DEFINER=`root`@`localhost` TRIGGER `agregar_cod_unico` BEFORE INSERT ON `usuarios` 
    FOR EACH ROW BEGIN 
    SET new.cod_unico = CONCAT(DATE_FORMAT(new.created, '%y'),DATE_FORMAT(new.created, '%m'),SUBSTR(UPPER(md5(new.id)),10,4));
    END

它没有给我任何错误但不起作用,插入后 id_unico 列仍然为空,但是,如果我用一些静态字符串替换 new.created 并且也为 new.id,它可以工作,我想也许这个值是插入后生成的?无论如何,我怎样才能获得 cod_unico 的值并将其插入到每个插入中?

标签: sqltriggersinsertmariadb

解决方案


最后我解决了它,我不能使用 created 和 id 列,因为它是一个插入前,但我可以使用 now() 作为 TIMESTAMP 和一点选择来获取自动递增的 id,所以功能代码是:

DROP TRIGGER IF EXISTS `agregar_cod_alumno`;
CREATE DEFINER=`root`@`localhost` TRIGGER `agregar_cod_alumno` BEFORE INSERT ON `usuarios` 
FOR EACH ROW BEGIN 

DECLARE user_id int default 0; 
SELECT auto_increment into user_id 
FROM information_schema.tables 
WHERE table_name = 'usuarios' 
AND table_schema = database(); 

SET new.cod_alumno = CONCAT(DATE_FORMAT(now(), '%y'),DATE_FORMAT(now(), '%m'),SUBSTR(UPPER(md5(user_id)),10,4)); 

END

推荐阅读