【问题标题】:Dynamic SQL If Statement?动态 SQL If 语句?
【发布时间】:2013-04-30 14:02:15
【问题描述】:

我在 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 中执行此操作。)

感谢(提前)您的帮助。

【问题讨论】:

    标签: mysql dynamic-sql


    【解决方案1】:

    if(由 Garath 建议)对我来说似乎是一个非常合理的解决方案。但是,如果您想在 MySQL SQL 范围内执行此操作,则可以引入一个新变量来计算第一个查询返回的行数。

    然后,将其包含在以下每个 updateinsert 语句中。为此,您需要将最后一条语句从 using values 更改为 using 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】:

      您可以使用 IF 语法来做到这一点:http://dev.mysql.com/doc/refman/5.5/en/if.html

      【讨论】:

      • 这是否意味着我必须使用存储过程?有没有办法用简单的查询来做到这一点?
      【解决方案3】:

      在 INSERT & UPDATE 语句中添加AND @myLeft is NOT NULL 怎么样?

      例子:

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

      【讨论】:

        猜你喜欢
        • 2011-01-03
        • 2015-03-13
        • 1970-01-01
        • 2012-01-16
        • 1970-01-01
        • 2022-11-11
        • 1970-01-01
        • 2016-11-10
        • 2013-05-09
        相关资源
        最近更新 更多