Mysql 动态SQL If语句?

Mysql 动态SQL If语句?,mysql,dynamic-sql,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

我正在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语句返回结果时才执行UPDATE和INSERT语句?(如果可能的话,我真的更愿意完全用SQL完成这项工作。)


(提前)感谢您的帮助。

您可以使用IF-syntaxt:

一个
IF
(如Garath所建议的)对我来说似乎是一个非常合理的解决方案。但是,如果您希望在MySQL SQL领域内执行此操作,那么可以引入一个新变量来计算第一次查询返回的行数

然后,将其包含在以下每个
update
insert
语句中。为此,您需要将最后一条语句从使用
值更改为使用
选择

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; 

如何添加
和@myLeft is NOT NULL
以插入和更新语句

例如:

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

这是否意味着我必须使用存储过程?用简单的查询是没有办法做到的吗?