gpt4 book ai didi

mysql - 触发器替代方案中的动态 SQL

转载 作者:行者123 更新时间:2023-11-29 03:07:04 25 4
gpt4 key购买 nike

我知道触发器中不允许使用准备好的语句,但我看不到我还能如何做我想做的事,因此我们将不胜感激任何替代方案/解决方法。

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 个值,Col1Col2new.Col3 .new.Col3 用于从不同的表中获取一行,然后将其与 Col2 一起用于搜索我需要的值所在的第三个表。Col1 是问题所在,因为它应该是 d 的动态生成的列名,但这不起作用。所以很明显,目前我得到的只是 d 中的 select 语句的字符串,这是我所期望的,但我无法执行该语句,因为那是不允许的。那么我怎样才能将动态生成的列名添加到 select 语句中呢?

表一

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。

我考虑过更改表架构,以便修复触发器中的列名,但这是最后的手段,因为它会导致其他代码位出现问题。

最佳答案

你将不得不完全放弃准备好的语句和动态 SQL 的想法,而只是痛苦地做一些 IF..THEN 语句:

DELIMITER $$

CREATE TRIGGER trigger1 after INSERT on table1
FOR EACH ROW
begin
DECLARE a varchar(30);
DECLARE b varchar(30);
DECLARE local_c varchar(30);
DECLARE d varchar(30);
SET a = new.Col1;
SET b = new.Col2;
SET local_c = (select Col4 from table2 where Col3=new.Col3);
IF local_c = 'a' THEN
select a into d from table3 where yq=local_c and xz=b;
END IF;
IF local_c = 'b' THEN
select b into d from table3 where yq=local_c and xz=b;
END IF;
IF local_c = 'c' THEN
select c into d from table3 where yq=local_c and xz=b;
END IF;
IF ISNULL(d) = 0 THEN
insert into table4 values (d);
END IF;
end
$$

DELIMITER;

关于mysql - 触发器替代方案中的动态 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13610782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com