gpt4 book ai didi

Mysql 存储过程复制父/子/孙层次结构中的记录

转载 作者:可可西里 更新时间:2023-11-01 07:06:37 25 4
gpt4 key购买 nike

我有 3 个表格的父表、子表和孙表:

+----------------+   +----------------+   +---------------------+
| parent | | child | | grandchild |
+----------------+ +----------------+ +---------------------+
| parent_id (PK) | | child_id (PK) | | grandchild_id (PK) |
| parent_data | | child_data | | grandchild_data |
+----------------+ | parent_id (FK) | | child_id (FK) |
+----------------+ +---------------------+

PK = 自增主键。
FK = 外键。

我想要一个可以复制父表中的记录以及子表和孙表中的任何关联记录的存储过程。我可以将父子数据复制好,这是我正在努力处理的孙子表。据我所知:

CREATE FUNCTION sf_copy_parent(p_parent_id INT) RETURNS INT
BEGIN
DECLARE new_parent_id INT;

-- create new parent record
INSERT INTO parent(parent_data)
SELECT parent_data FROM parent
WHERE parent_id=p_parent_id;
SET new_parent_id=LAST_INSERT_ID();

-- copy child records
INSERT INTO child(child_data,parent_id)
SELECT child_data,new_parent_id FROM child
WHERE parent_id=p_parent_id;

-- copy grandchild records ???


-- return
RETURN new_parent_id;
END

如果这很重要,我正在使用 Mysql5.5。

最佳答案

试试这个 SELECT 查询(它使用 'p_parent_id' 和 'new_parent_id' 变量)-

SET @r1 = 1;
SET @child_id = NULL;
SET @r2 = 0;

SELECT c1.grandchild_data, c2.child_id FROM (
SELECT @r1 := if(c.child_id IS NULL OR c.child_id <> @child_id, @r1 + 1, @r1) rank, @child_id := c.child_id, c.child_id, g.grandchild_data FROM child c
JOIN grandchild g
ON c.child_id = g.child_id
WHERE
c.parent_id = p_parent_id
ORDER BY
c.child_id, g.grandchild_id
) c1
JOIN (SELECT @r2 := @r2 + 1 rank, child_id FROM child WHERE parent_id = new_parent_id ORDER BY child_id) c2
ON c1.rank = c2.rank;

如果可行,我们将重写为 INSERT..SELECT 语句,或者自己尝试;)

关于Mysql 存储过程复制父/子/孙层次结构中的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5703626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com