mysql - 动态 SQL If 语句?

标签 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 来做这件事。)

(提前)感谢您的帮助。

最佳答案

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; 

关于mysql - 动态 SQL If 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16405123/

相关文章:

sql - 如何在 SQL 存储过程中传递动态 View 名称而不使用动态查询?

postgresql - plpgsql中的动态变量名(字符串到变量名)

java - android.content.res.Resources$NotFoundException : String resource ID #0x2 Database

mySQL delete 查询在不同的列上有两个条件

sql - 是否可以从 SQL Server 触发器向 MySQL 插入数据?

PostgreSQL 9.3 触发器函数插入到具有参数化名称的表中

postgresql - 如何在 Postgres 中删除表的所有索引?

sql - 在循环中使用 replace()

php - 我尝试在 SQL 中进行 INSERT WHERE,但它给了我一个错误

mysql - JOIN 查询产生不需要的结果