[SQL] MySQL은 트리거 - 변수에 SELECT 저장
SQLMySQL은 트리거 - 변수에 SELECT 저장
나는 두 가지에 사용할 수 있도록, 내가 INT 나는 SELECT에서 얻을 보유하고 변수를 갖고 싶어하는 트리거가 대신 두 번 SELECT를 호출 문 IF. 어떻게 MySQL의 트리거에 / 사용 변수를 선언합니까?
해결법
-
==============================
1.당신은 DECLARE 구문으로, MySQL의 트리거에 로컬 변수를 선언 할 수 있습니다.
당신은 DECLARE 구문으로, MySQL의 트리거에 로컬 변수를 선언 할 수 있습니다.
다음은 그 예이다 :
DROP TABLE IF EXISTS foo; CREATE TABLE FOO ( i SERIAL PRIMARY KEY ); DELIMITER // DROP TRIGGER IF EXISTS bar // CREATE TRIGGER bar AFTER INSERT ON foo FOR EACH ROW BEGIN DECLARE x INT; SET x = NEW.i; SET @a = x; -- set user variable outside trigger END// DELIMITER ; SET @a = 0; SELECT @a; -- returns 0 INSERT INTO foo () VALUES (); SELECT @a; -- returns 1, the value it got during the trigger
당신이 변수에 값을 할당 할 때, 당신은 확인해야합니다 쿼리 만 반환 단일 값이 아닌 행 집합 또는 열 집합이. "하위 쿼리 반환 이상 1 행 ERROR 1242"쿼리가 실제로 단일 값을 반환하는 경우 더 이상의 행을 반환로 예를 들어, 당신이 얻을 빨리 좋아하지만입니다.
당신은 확실히 로컬 변수가 하나의 값으로 설정되어 있는지 확인하는 LIMIT 또는 MAX ()를 사용할 수 있습니다.
CREATE TRIGGER bar AFTER INSERT ON foo FOR EACH ROW BEGIN DECLARE x INT; SET x = (SELECT age FROM users WHERE name = 'Bill'); -- ERROR 1242 if more than one row with 'Bill' END// CREATE TRIGGER bar AFTER INSERT ON foo FOR EACH ROW BEGIN DECLARE x INT; SET x = (SELECT MAX(age) FROM users WHERE name = 'Bill'); -- OK even when more than one row with 'Bill' END//
-
==============================
2.
`CREATE TRIGGER `category_before_ins_tr` BEFORE INSERT ON `category` FOR EACH ROW BEGIN **SET @tableId= (SELECT id FROM dummy LIMIT 1);** END;`;
-
==============================
3.
CREATE TRIGGER clearcamcdr AFTER INSERT ON `asteriskcdrdb`.`cdr` FOR EACH ROW BEGIN SET @INC = (SELECT sip_inc FROM trunks LIMIT 1); IF NEW.billsec >1 AND NEW.channel LIKE @INC AND NEW.dstchannel NOT LIKE "" THEN insert into `asteriskcdrdb`.`filtre` (id_appel,date_appel,source,destinataire,duree,sens,commentaire,suivi) values (NEW.id,NEW.calldate,NEW.src,NEW.dstchannel,NEW.billsec,"entrant","",""); END IF; END$$
그나마이 @ 홈 시도
-
==============================
4.내가 필요로했던 힘든 시간을 발견했기 때문에 나는이 솔루션을 게시하도록하겠습니다. 이 포스팅은 나에게 여기, 데이터 테스트 일치하는 경우 삽입 전에 열 데이터 정리에 대한 최종 솔루션입니다 충분히 가까이 (감사가 +1)를 얻었다.
내가 필요로했던 힘든 시간을 발견했기 때문에 나는이 솔루션을 게시하도록하겠습니다. 이 포스팅은 나에게 여기, 데이터 테스트 일치하는 경우 삽입 전에 열 데이터 정리에 대한 최종 솔루션입니다 충분히 가까이 (감사가 +1)를 얻었다.
참고 :이 내가 상속 레거시 프로젝트입니다 :
어쨌든, 여기에 기존 열에 풋 중복 키는 우리가 유산을 저장하도록 허용하면서 그 트리거가 나쁜 데이터는 (그리고 얻고 테이블을 복합, 고유 키를 유발하지 않음).
BEGIN -- prevent duplicate composite keys when merging in archive to main SET @EXIST_COMPOSITE_KEY = (SELECT count(*) FROM patientrecords where rridprefix = NEW.rridprefix and rrid = NEW.rrid); -- if the composite key to be introduced during merge exists, rearrange the data for insert IF @EXIST_COMPOSITE_KEY > 0 THEN -- set the incoming column data this way (if composite key exists) -- the legacy duplicate rrid field will help us keep the bad data SET NEW.legacyduperrid = NEW.rrid; -- allow the following block to set the new rrid appropriately SET NEW.rrid = null; END IF; -- legacy code tried set the rrid (race condition), now the db does it SET NEW.rrid = ( SELECT if(NEW.rrid is null and NEW.legacyduperrid is null, IFNULL(MAX(rrid), 0) + 1, NEW.rrid) FROM patientrecords WHERE rridprefix = NEW.rridprefix ); END
-
==============================
5.또는 당신은 트리거 행 (들)의 열 중 하나로 전달되도록 트리거를 호출 년대 SQL의 SELECT 문을 만 포함 할 수 있습니다. 만큼 당신이 확신하는대로이를 확실히 한 행 (따라서 하나의 값)을 반환합니다. (그리고, 물론,이 값을 반환하지해야하는 트리거 논리와 상호 작용하지만, 그 어떤 경우에도 사실입니다.)
또는 당신은 트리거 행 (들)의 열 중 하나로 전달되도록 트리거를 호출 년대 SQL의 SELECT 문을 만 포함 할 수 있습니다. 만큼 당신이 확신하는대로이를 확실히 한 행 (따라서 하나의 값)을 반환합니다. (그리고, 물론,이 값을 반환하지해야하는 트리거 논리와 상호 작용하지만, 그 어떤 경우에도 사실입니다.)
from https://stackoverflow.com/questions/324605/mysql-trigger-storing-a-select-in-a-variable by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 많은 관계로 많은 EntityFramework 같은 표 (0) | 2020.06.05 |
---|---|
[SQL] SQL 쿼리에서 카운트를 캡처 (0) | 2020.06.05 |
[SQL] 어떻게 C # .NET 코드에서 저장 프로 시저는 SQL에 널 변수를 전달하는 방법 (0) | 2020.06.05 |
[SQL] ORA-00972 너무 오래 별칭 열 이름 식별자 (0) | 2020.06.05 |
[SQL] SqlConnectionStringBuilder를 사용하여 연결 문자열에서 데이터베이스 이름을 얻는 방법 (0) | 2020.06.05 |