我有一张名为 users
的表格。
此表格与 agendas
相关联, events
与 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;
相关联。
议程可以有0或n个事件。
现在,如果我想用他的所有议程和事件克隆用户#3,保持所有外键最新,该怎么办?
我知道如何使用多个查询(SELECT然后INSERT,get inserted_id等等),但我不知道如何在单个查询中执行此操作。
我还发现了如何复制用户的行,但不是它的子行:
{{1}}
所以,如果有人有了想法,我不是mySQL的专家,我不知道这是否可能......:)
答案 0 :(得分: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 强>
假设所有表都将id列(user_id
,agenda_id
,event_id
)设置为auto_increment
您可以随时将其包装到存储过程中,并使用正在克隆的用户的输入参数。