트리거 내에서 준비된 문이 허용되지 않는다는 것을 알고 있지만 내가 원하는 것을 어떻게 할 수 있는지 알 수 없으므로 모든 대안/해결 방법을 크게 높이 평가할 수 있습니다.트리거 대안 내의 동적 SQL
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
의 열 이름으로되어 있기 때문에 문제가되지만 이것이 작동하지 않습니다. 분명히 지금 내가 돌아오고있는 순간은 d
에있는 select 명령문의 문자열입니다.하지만 이것은 허용되지 않기 때문에 명령문을 실행할 수 없습니다. 그래서 동적으로 생성 된 열 이름을 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
I 원하는 결과는도 1a 내지도 9c.
트리거의 열 이름을 수정할 수 있도록 테이블 스키마를 변경하는 것이 고려되었지만 다른 코드 비트에 문제가 발생할 수 있으므로 최후의 수단이됩니다.
좋은 생각인데, 그 일에 상당히 의지해야했지만, 그런 식으로 생각하지 않았습니다. – mrmryb
이것은 추악하고, 장황하고 잠재적으로 유지 관리 작업이 많이 걸리지 만 실제로 MySQL의 한계에 비추어이를 수행하는 유일한 방법입니다. –