1

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

在此先感谢您的帮助。

4

3 回答 3

0

您可以使用 IF 语法来执行此操作:http: //dev.mysql.com/doc/refman/5.5/en/if.html

于 2013-05-06T18:48:31.930 回答
0

An 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; 
于 2013-05-06T19:04:34.737 回答
0

添加AND @myLeft is NOT NULL到 INSERT 和 UPDATE 语句怎么样?

例子:

UPDATE      t 
    SET         rgt = rgt + 2 
    WHERE       rgt > @myLeft
    AND         @myLeft is NOT NULL
于 2013-05-06T19:12:38.967 回答