2017-01-15 3 views
0

두 개의 MySQL 테이블이 있는데, 첫 번째 테이블은 인접성 목록 모델에 따라 구축 된 트리를 저장하고 두 번째 테이블은 각 노드의 경로를 저장하는 도우미 테이블입니다.다른 테이블에 INSERT 한 후 테이블에 레코드를 삽입하는 MySQL 트리거

질문은 트리거를 설정하는 방법이므로 인접 레코드 테이블에 삽입 한 후에 경로 레코드를 저장하는 레코드가 도우미 테이블에 삽입됩니다.

아이디어는 여기에 동일합니다 https://kod34fr33.wordpress.com/2008/05/06/adjacency-list-tree-on-mysql/ 하지만 다음과 같은 차이점이 :

노드의 직접 부모 ID = 0이있는 루트 (경우에 대한 기록은 도우미 테이블에 저장해서는 안
  • )
  • 경로
  • 경로
  • 없음을 선도도 후행 슬래시 끝에 레코드의 ID를 저장하지 않는 "." delimitor 대신 "/"

테이블 구조 :

  • 인접 테이블 : "prefix_productcategories"열 id, parent, name.
  • 도우미 테이블 "prefix_prodcat_path '항목은 : id, path
  • id, parent (3) UNSIGNED
  • path 텍스트가 SMALLINT이다이다.

초기 코드를 여러 번 수정 한 후에 구문 오류를 수정할 수 있습니다. 그래서, 여기에 다른 사람을 도울 수있는 희망, (그리고 아마도 너무 MySQL 용) MariaDB에 대한 하나 개의 가능한 솔루션입니다 :

DELIMITER // 
CREATE TRIGGER `insertProdCatPathRecord` AFTER INSERT ON `prefix_productcategories` 
FOR EACH ROW BEGIN 
    DECLARE `path_of_parent` TEXT DEFAULT ''; 
    IF (NEW.`parent` > 0) THEN 
    SELECT `path` INTO `path_of_parent` FROM `prefix_prodcat_path` WHERE `prefix_prodcat_path`.`id`= NEW.`parent`; 
    IF (SELECT FOUND_ROWS()) THEN 
     INSERT INTO `prefix_prodcat_path` VALUES (NEW.`id`,CONCAT(NEW.`parent`,'.',NEW.`id`)); 
    ELSE 
     INSERT INTO `prefix_prodcat_path` VALUES(NEW.`id`,NEW.`parent`); 
    END IF; 
    END IF; 
END; // 
DELIMITER ; 
+0

프로 시저/함수/트리거를 만들 때이 절차 후 임시 구분 기호를 사용해야합니다. /' –

+0

물론 가능합니다. 미안해. 구문에 어떤 문제가 있습니까? "DECLARE ..."행과 "INTO ..."행을 제거하면 구문 오류가 "SELECT ..."행에 남아 있습니다. – OuzoPower

+0

코드를 정리할 때 배웠던 점 : 1) END IF 및 END 키워드 뒤에 세미콜론이 필요합니다. 2) 어떤 이유로 CAST() TEXT CONCAT() 함수에 숫자 값을 시도하는 작동하지 않습니다. 아마도 CONCAT()이 불필요한 캐스팅을 할 것입니다. – OuzoPower

답변

0

글쎄, 여기에 내가 지금까지 발견 한 것입니다. IF과 관련된 키워드가 THEN이고 END IF 대신 END이있는 키워드가 없습니다. DECLARE의 구문이 잘못되었으므로 기본값을 설정할 수 없습니다. 또한 @@ ROWCOUNT이 (가) 무엇인지 모릅니다. (편집 : MS SQL Server와 관련이 있지만 MySQL에서는 사용되지 않습니다.)

DELIMITER // 
CREATE TRIGGER insertProdCatPathRecord AFTER INSERT ON prefix_productcategories 
FOR EACH ROW 
BEGIN 
IF (NEW.parent > 0) THEN 
    DECLARE path_of_parent TEXT; 
    SET path_of_parent=''; 
    SELECT path INTO path_of_parent FROM prefix_prodcat_path WHERE prefix_prodcat_path.id= NEW.parent; 
    IF (@@ROWCOUNT) THEN 
     INSERT INTO prefix_prodcat_path VALUES(NEW.id,CONCAT(NEW.parent,'.',NEW.id)); 
    ELSE 
     INSERT INTO prefix_prodcat_path VALUES(NEW.id,NEW.parent); 
    END IF; 
END IF; 
END; 
// 
DELIMITER ; 
+0

수정 한 구문 오류에 대해 언급 해 주셔서 감사합니다. 첫 번째 INSERT 문에서 CONCAT이 완료되면 'path_of_parent'임시 변수가 제거되었습니다. 나는 몇몇의 BEGIN ... END 샌드위치도 제거했다. 나는 원래 게시물에 내 두 번째 시도를 게시했습니다. 아쉽게도 첫 번째 INSERT 근처에 구문 오류가 있습니다. – OuzoPower

+0

해결책을 찾았습니다. 원본 게시물을 참조하십시오. – OuzoPower

관련 문제