mysql - 在触发器中获取动态表名
问题描述
tb_sites_21
我正在创建一个触发器
CREATE DEFINER=`root`@`localhost`
TRIGGER `color_changed`
AFTER INSERT ON `tb_tickets`
FOR EACH ROW UPDATE tb_sites_21
SET color_status = NEW.status
WHERE site_id = NEW.site_id;
它工作正常,唯一我需要的是 tb_sites_21,我希望从创建新条目的 tb_tickets 的 program_id 中挑选这 21 个。
像这样的东西:
CREATE DEFINER=`root`@`localhost`
TRIGGER `color_changed`
AFTER INSERT ON `tb_tickets`
FOR EACH ROW UPDATE tb_sites_NEW.program_id
SET color_status = NEW.status
WHERE site_id = NEW.site_id;
或者
CREATE DEFINER=root@localhost
TRIGGER color_changed AFTER INSERT ON tb_tickets FOR EACH ROW
SET @table_name := (SELECT CONCAT("tb_sites_" , program_id)
FROM tb_tickets
WHERE ticket_id = NEW.ticket_id);
UPDATE table_name set
color_status = NEW.status WHERE site_id = NEW.site_id
我该如何做到这一点?
解决方案
每个 program_id 的表分区是一个棘手的设计:SELECT * FROM sales + @yymm
您不能在触发器内动态 SQL/prepared 语句,因此唯一可行的选项是 usingIF
语句,但您需要提前知道表名。
CREATE DEFINER=`root`@`localhost`
TRIGGER `color_changed`
AFTER INSERT
BEGIN
IF NEW.program_id = 1 THEN
UPDATE tb_sites_1
SET color_status = NEW.status
WHERE site_id = NEW.site_id;
ELSEIF NEW.program_id = 2 THEN
UPDATE tb_sites_2
SET color_status = NEW.status
WHERE site_id = NEW.site_id;
ELSEIF ... THEN
-- ...
ELSE
-- ...
END
END;
推荐阅读
- python - 使用嵌套对象 Django Rest Framework 在 ModelViewSet 上发布
- scala - 我在 scala 类上尝试 javap -p classname 但在 REPL 中出错
- woocommerce - 在 WooCommerce 中的变化旁边显示价格
- regex - 带有 if/else 条件的正则表达式正前瞻
- webgl - WebGL:异步操作?
- dc.js - dc.js 用数据表分页
- windows - 管道查找结果到变量中
- wpf - WPF InkCanvas 甚至在超出剪辑范围的空间上绘制。覆盖命中测试
- c++ - 如何使输入文本文件成为构造函数参数?C++
- windows - Windows 上的脚本来下载和恢复 Heroku postgres 数据库