2013-05-06 2 views
1

mysql에 중첩 세트를 저장하려고합니다. 이 잘 작동동적 SQL If 문?

SELECT  @myLeft := lft 
    FROM  t 
    WHERE  id = ?; 

    UPDATE  t 
    SET   rgt = rgt + 2 
    WHERE  rgt > @myLeft; 

    UPDATE  t 
    SET   lft = lft + 2 
    WHERE  lft > @myLeft; 

    INSERT INTO t 
       (title, lft, rgt) 
    VALUES  ("New", @myLeft + 1, @myLeft + 2); 

:

나는 노드를 삽입하기 위해 다음과 같은 동적 SQL을 사용합니다. 그러나 잠재적 인 문제가 있습니다. 첫 번째 SELECT가 결과를 반환하지 않으면 계층 구조가 손상됩니다. 이것을 트랜잭션으로 래핑해도 문제가되지 않습니다.

첫 번째 SELECT 문에서 결과가 반환되는 경우에만 UPDATE 및 INSERT 문이 실행되도록하려면 어떻게해야합니까? 가능하다면 SQL로이 작업을 수행하는 것이 좋습니다.

도움을 주셔서 감사합니다. syntaxt 경우

답변

0

(Garath에 의해 제안) if 나에게 매우 합리적인 해결책과 같은 것 같은. 그러나 MySQL SQL의 영역 내에서이를 수행하려는 경우 첫 번째 쿼리가 반환하는 행 수를 세는 새로운 변수를 도입 할 수 있습니다.

그런 다음 updateinsert 문에이 내용을 포함하십시오. 이렇게하려면, 당신은 select를 사용하여 values를 사용하는 마지막 문을 변경해야

SELECT  @myLeft := lft , @cnt := @cnt + 1 
FROM  t cross join (select @cnt := 0) const 
WHERE  id = ?; 

UPDATE  t 
SET   rgt = rgt + 2 
WHERE  rgt > @myLeft and @cnt > 0; 

UPDATE  t 
SET   lft = lft + 2 
WHERE  lft > @myLeft and @cnt > 0; 

INSERT INTO t 
      (title, lft, rgt) 
    select "New", @myLeft + 1, @myLeft + 2 
    where @cnt > 0; 
0

당신은 사용하여이 작업을 수행 할 수 있습니다 http://dev.mysql.com/doc/refman/5.5/en/if.html

+0

이 내가 저장 프로 시저를 사용한다는 것을 의미 하는가? 간단한 쿼리를 사용하여이를 수행 할 수있는 방법이 없습니까? – user1031947

0

무엇 AND @myLeft is NOT NULL을 추가하는 방법에 대한이 & UPDATE 문을 삽입?

예 :

UPDATE  t 
    SET   rgt = rgt + 2 
    WHERE  rgt > @myLeft 
    AND   @myLeft is NOT NULL