Mysql 动态SQL If语句?
我正在mysql中存储一个嵌套集 我使用以下动态sql插入节点: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
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
这是否意味着我必须使用存储过程?用简单的查询是没有办法做到的吗?