복붙노트

[SQL] MySQL은 트리거 - 변수에 SELECT 저장

SQL

MySQL은 트리거 - 변수에 SELECT 저장

나는 두 가지에 사용할 수 있도록, 내가 INT 나는 SELECT에서 얻을 보유하고 변수를 갖고 싶어하는 트리거가 대신 두 번 SELECT를 호출 문 IF. 어떻게 MySQL의 트리거에 / 사용 변수를 선언합니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    5.또는 당신은 트리거 행 (들)의 열 중 하나로 전달되도록 트리거를 호출 년대 SQL의 SELECT 문을 만 포함 할 수 있습니다. 만큼 당신이 확신하는대로이를 확실히 한 행 (따라서 하나의 값)을 반환합니다. (그리고, 물론,이 값을 반환하지해야하는 트리거 논리와 상호 작용하지만, 그 어떤 경우에도 사실입니다.)

    또는 당신은 트리거 행 (들)의 열 중 하나로 전달되도록 트리거를 호출 년대 SQL의 SELECT 문을 만 포함 할 수 있습니다. 만큼 당신이 확신하는대로이를 확실히 한 행 (따라서 하나의 값)을 반환합니다. (그리고, 물론,이 값을 반환하지해야하는 트리거 논리와 상호 작용하지만, 그 어떤 경우에도 사실입니다.)

  6. from https://stackoverflow.com/questions/324605/mysql-trigger-storing-a-select-in-a-variable by cc-by-sa and MIT license