2013-05-06 59 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