, , @Devart . , , .
. , InnoDB, MyISAM. , - , MyISAM. (InnoDB , MyISAM ). , MyISAM , " ", "" . SORT BY , , .
CREATE PROCEDURE sp_copy(p_parent_id INT)
BEGIN
DECLARE new_parent_id INT;
INSERT INTO parent(parent_data) SELECT parent_data FROM parent WHERE parent_id=p_parent_id;
SET new_parent_id:=LAST_INSERT_ID();
INSERT INTO child(child_data, parent_id)
SELECT child_data, new_parent_id FROM child WHERE parent_id=p_parent_id;
SET @rank1:=0;
SET @rank2:=0;
INSERT INTO grandchild(grandchild_data, child_id) SELECT gc.grandchild_data, c2.child_id FROM
(SELECT child_id, @rank1:=@rank1+1 as rank FROM child WHERE parent_id=p_parent_id) c1
INNER JOIN
(SELECT child_id, @rank2:=@rank2+1 as rank FROM child WHERE parent_id=new_parent_id) c2 ON c1.rank=c2.rank
INNER JOIN grandchild gc ON c1.child_id=gc.child_id;
END
In addition, you can use the same principle when copying greatgrandchild tables when copying grandson records. The only additional difficulty is adding a join to each of the two subqueries. This is necessary because the child.parent_id field requires a link in the WHERE clause:
SET @rank1:=0;
SET @rank2:=0;
INSERT INTO greatgrandchild(greatgrandchild_data, grandchild_id) SELECT ggc.greatgrandchild_data, gc2.grandchild_id FROM
(SELECT grandchild_id, @rank1:=@rank1+1 as rank FROM grandchild INNER JOIN child ON child.child_id=grandchild.child_id WHERE parent_id=p_parent_id) gc1
INNER JOIN
(SELECT grandchild_id, @rank2:=@rank2+1 as rank FROM grandchild INNER JOIN child ON child.child_id=grandchild.child_id WHERE parent_id=new_parent_id) gc2 ON gc1.rank=gc2.rank
INNER JOIN greatgrandchild ggc ON gc1.grandchild_id=ggc.grandchild_id;
David source
share