2

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

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 个值Col1Col2, 和new.Col3new.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。

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

4

2 回答 2

3

您将不得不完全放弃准备好的语句和动态 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;
于 2012-11-28T18:01:28.927 回答
-3

尝试使用准备好的语句,如下所示:

 PREPARE myStmt FROM 
 'concat( insert into table4 values (', 
          'select ',
          a,
          ' from table3 where yq=',
          c,
          ' and xz=',
          b, 
          '))';
 EXECUTE myStmt;
于 2012-11-28T17:27:56.383 回答