我知道触发器中不允许使用准备好的语句,但我看不出我还能如何做我想做的事,因此任何替代方案/解决方法将不胜感激。
DELIMITER $$
CREATE TRIGGER trigger1 after INSERT on table1
FOR EACH ROW
begin
DECLARE a varchar(30);
DECLARE b varchar(30);
DECLARE c varchar(30);
DECLARE d varchar(30);
SET a = new.Col1;
SET b = new.Col2;
SET c = (select Col4 from table2 where Col3=new.Col3);
SET d = concat('select ',a,' from table3 where yq=',c,' and xz=',b);
insert into table4 values (d);
end
$$
DELIMITER;
那么发生了什么:插入一行并从该行中获取 3 个值Col1
,Col2
, 和new.Col3
。
new.Col3
用于从不同的表中获取一行,然后用于Col2
搜索我需要的值所在的第三个表。
Col1
是问题所在,因为它应该是动态生成的列名,d
但这不起作用。所以很明显,目前我得到的只是一个 select 语句的字符串,d
这是我所期望的,但我无法执行该语句,因为这是不允许的。那么如何将动态生成的列名放入 select 语句中呢?
表格1
Col1 | Col2 | Col3
c | d | x
a | e | y
b | e | z
b | f | x
表 2
Col3 | Col4
x | 1
y | 2
z | 3
表3
a | b | c | xz | yq
1a | 1b | 1c | d | 1
2a | 2b | 2c | d | 2
3a | 3b | 3c | d | 3
4a | 4b | 4c | e | 1
5a | 5b | 5c | e | 2
6a | 6b | 6c | e | 3
7a | 7b | 7c | f | 1
8a | 8b | 8c | f | 2
9a | 9b | 9c | f | 3
我想要的结果是1a-9c。
我考虑过更改表架构,以便可以修复触发器中的列名,但这将是最后的手段,因为它会导致其他代码位出现问题。