sql - 在插入 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 的值并将其插入到每个插入中?
解决方案
最后我解决了它,我不能使用 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
推荐阅读
- spring-boot - 在 Spring Boot 应用程序部署到外部 tomcat 中找不到类
- node.js - 在我的node.js应用程序中使用mongodb和mongoose在Mocha和Chai上运行测试后无法清除数据库
- c++ - C++ 类实例未初始化但没有编译错误,为什么
- spring - 当从不使用附加程序时,我希望不创建 Logback 文件。[滚动文件附加器]
- cassandra - Cassandra 时间点恢复
- python - Venv 在 CentOS 中失败,确保 pip 丢失
- c++ - 我可以检测哪些类型在用作基类时可能与其派生类重叠
- android - 如何以编程方式在 Android 中设置 DNS1 和 DNS2 以及如何检查 DNS 是否设置?
- angular - 如何删除 Angular 7 中的引导工具栏?
- postgresql - 在 Postgres 函数中使用参数作为列名