动态SQL如果声明?

时间:2013-05-06 18:45:08

标签: mysql dynamic-sql

我在mysql中存储了一个嵌套集。

我使用以下动态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没有返回任何结果,则层次结构将被破坏。在交易中包装它不会阻止这种情况。

如果第一个SELECT语句返回结果,我怎么能确保只执行UPDATE和INSERT语句? (如果可能的话,我更愿意在SQL中完全这样做。)

先谢谢你的帮助。

3 个答案:

答案 0 :(得分:0)

您可以使用IF语法执行此操作:{{3p>

答案 1 :(得分: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; 

答案 2 :(得分:0)

如何将AND @myLeft is NOT NULL添加到INSERT& UPDATE语句?

示例:

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