我在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中完全这样做。)
先谢谢你的帮助。
答案 0 :(得分:0)
您可以使用IF语法执行此操作:{{3p>
答案 1 :(得分:0)
if
(正如Garath所建议的)对我来说似乎是一个非常合理的解决方案。但是,如果要在MySQL SQL的范围内执行此操作,则可以引入新变量来计算第一个查询返回的行数。
然后,在以下每个update
和insert
语句中包含此内容。为此,您需要将最后一个语句从使用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