gpt4 book ai didi

MySQL - 克隆一行及其所有子项

转载 作者:行者123 更新时间:2023-11-29 02:28:42 26 4
gpt4 key购买 nike

我有一个名为 users 的表。此表链接到 agendas,后者本身链接到 events

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

那么现在,如果我想克隆用户 #3 及其所有议程和事件,并使所有外键保持最新怎么办?

我知道如何使用多个查询(SELECT 然后 INSERT,获取 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 的专家,我不知道这是否可能......:)

最佳答案

恕我直言,你正在寻找这样的东西

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_idagenda_idevent_id)设置为 auto_increment

而且您始终可以将其包装到一个存储过程中,其中包含要克隆的用户的输入参数。

关于MySQL - 克隆一行及其所有子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473513/

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