두 개의 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) UNSIGNEDpath
텍스트가 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 ;
프로 시저/함수/트리거를 만들 때이 절차 후 임시 구분 기호를 사용해야합니다. /' –
물론 가능합니다. 미안해. 구문에 어떤 문제가 있습니까? "DECLARE ..."행과 "INTO ..."행을 제거하면 구문 오류가 "SELECT ..."행에 남아 있습니다. – OuzoPower
코드를 정리할 때 배웠던 점 : 1) END IF 및 END 키워드 뒤에 세미콜론이 필요합니다. 2) 어떤 이유로 CAST() TEXT CONCAT() 함수에 숫자 값을 시도하는 작동하지 않습니다. 아마도 CONCAT()이 불필요한 캐스팅을 할 것입니다. – OuzoPower