2013-05-10 50 views
2

我有一个表名为users。 此表链接到agendas,它本身链接到eventsMySQL - 克隆一行及其所有子项

议程可以有0或n个事件。

那么现在,如果我想克隆用户#3的所有议程和事件,保持所有外键是最新的呢?

我知道如何做到这一点与多个查询(选择然后插入,得到inserted_id等......),但我不知道如何在单个查询中做到这一点。

我也发现了如何复制用户的行,而不是它的孩子们:

CREATE TEMPORARY TABLE tmp_users SELECT * FROM users WHERE userID = 3; 
UPDATE tmp_users SET userID = NULL; 
INSERT INTO users SELECT * FROM tmp_users; 
DROP TEMPORARY TABLE IF EXISTS tmp_users; 

因此,如果任何人有一个想法,我不是的MySQL亲,我不事件知道这是可能的... :)

回答

2

恕我直言,你正在寻找这样的事情

INSERT INTO users (user_name, ...) 
SELECT user_name, ... 
    FROM users 
WHERE user_id = 3; 

SET @last_user_id = LAST_INSERT_ID(); 

INSERT INTO agendas (user_id, agenda_name, ...) 
SELECT @last_user_id, agenda_name, ... 
    FROM agendas 
WHERE user_id = 3; 

INSERT INTO events (agenda_id, event_name, ...) 
SELECT a3.agenda_id_new, e.event_name, ... 
    FROM events e JOIN 
(SELECT a1.agenda_id agenda_id_old, 
     a2.agenda_id agenda_id_new 
    FROM 
(SELECT agenda_id, @n := @n + 1 n 
    FROM agendas, (SELECT @n := 0) n 
    WHERE user_id = 3 ORDER BY agenda_id) a1 JOIN 
(SELECT agenda_id, @m := @m + 1 m 
    FROM agendas, (SELECT @m := 0) m 
    WHERE user_id = @last_user_id ORDER BY agenda_id) a2 ON a1.n = a2.m) a3 
    ON e.agenda_id = a3.agenda_id_old; 

SQLFiddle

的假设是,所有表都设置为auto_increment

ID列(user_idagenda_idevent_id),你可以随时与用户的输入参数,把它包装成一个存储过程中被克隆。

+0

@ julien-l有帮助吗?你的问题需要更多帮助吗? – peterm 2013-05-11 05:19:49

+0

Eyh peter,谢谢你的回答,我现在没有时间尝试它(新的优先事项^^),但我将在未来的日子里使用它,所以我会随时向你通报!再次感谢! – Niflhel 2013-05-13 19:01:17

+0

所以,我只是尝试了一些修改以适合我的数据库,并且它的工作很好......这正是我想要做的! 再次感谢! – Niflhel 2013-05-17 17:44:08