2013-05-10 23 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