2013-05-06 94 views
1

我在mysql中存儲一個嵌套集。動態SQL如果聲明?

我用下面的動態SQL插入一個節點:

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); 

這工作得很好。但是有一個潛在的問題,如果第一個SELECT沒有返回任何結果,那麼層次結構將被破壞。在交易中包裝這不會妨礙這一點。

我怎樣才能確保UPDATE和INSERT語句,如果第一個SELECT語句返回一個結果只執行? (如果可能的話,我真的喜歡在SQL完全做到這一點。)

感謝(提前)對你的幫助。

回答

0

if(由Garath的所建議的)似乎是一個非常合理的解決方案給我。但是,如果您想在MySQL SQL領域內完成此操作,則可以引入一個新變量來計算第一個查詢返回的行數。

然後,在下面的每個updateinsert聲明中包含此項。要做到這一點,你需要的最後一條語句使用values改爲使用select

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

有關添加AND @myLeft is NOT NULL什麼INSERT & UPDATE語句?

例子:

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