作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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 领域内执行此操作,则可以引入一个新变量来计算第一个查询返回的行数。
然后,将其包含在以下每个 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;
关于mysql - 动态 SQL If 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16405123/
我是一名优秀的程序员,十分优秀!