分成几个sql来更新
时间: 2023-07-04 15:22:30 浏览: 40
将更新子节点到其他父节点的 SQL 查询分成多个查询可以使操作更加安全和可控。以下是一种分成多个 SQL 查询的方法:
1. 查询要移动的子节点及其所有后代节点的左右值。
2. 计算要更新的节点及其后代节点的左右值的偏移量。
3. 开启事务。
4. 更新所有左值大于当前节点的左值且右值小于当前节点的右值的节点的左值和右值。
5. 更新所有左值大于当前节点的右值的节点的左值和右值。
6. 更新当前节点及其所有后代节点的左值和右值。
7. 更新所有左值大于或等于目标父节点的左值的节点的左值和右值。
8. 更新所有左值大于目标父节点的右值的节点的左值和右值。
9. 提交事务。
以下是一个分成多个 SQL 查询的示例:
```
SET @myLeft := 0, @myRight := 0, @offset := :offset;
SELECT lft, rgt, rgt - lft + 1 INTO @myLeft, @myRight, @size
FROM categories
WHERE id = :categoryId;
START TRANSACTION;
UPDATE categories
SET lft = lft + @offset
WHERE lft BETWEEN @myLeft AND @myRight;
UPDATE categories
SET rgt = rgt + @offset
WHERE rgt BETWEEN @myLeft AND @myRight;
UPDATE categories
SET lft = CASE
WHEN lft BETWEEN @myLeft AND @myRight THEN lft + @offset
ELSE lft
END,
rgt = CASE
WHEN rgt BETWEEN @myLeft AND @myRight THEN rgt + @offset
ELSE rgt
END
WHERE rgt > @myRight;
UPDATE categories
SET lft = CASE
WHEN lft > @parentRight THEN lft + @size
ELSE lft
END,
rgt = CASE
WHEN rgt > @parentRight THEN rgt + @size
ELSE rgt
END
WHERE lft >= @parentLeft;
UPDATE categories
SET lft = CASE
WHEN lft > @parentRight THEN lft + @size
ELSE lft
END,
rgt = CASE
WHEN rgt > @parentRight THEN rgt + @size
ELSE rgt
END
WHERE rgt > @parentRight;
COMMIT;
```
在这个示例中,第 4~6 个 SQL 查询更新了要移动的子节点及其所有后代节点的左右值,第 7~8 个 SQL 查询更新了和目标父节点相关的节点的左右值。这些 SQL 查询都在一个事务中执行,以确保操作的原子性和一致性。