MySQL 批量插入数据:将 C 表数据导入 ask_questions 和 ask_answers 表
使用事务和循环将数据从 C 表导入 ask_questions 和 ask_answers 表
本教程演示如何在 MySQL 数据库中,使用事务和循环的方式,将一个名为 C 的表中的数据批量导入到 ask_questions 和 ask_answers 表中,确保每个问题标题与答案的对应关系。
前提:
- 现有 C 表,包含
问题标题和问题答案两个字段,其中包含 100 条数据。 - 现有
ask_questions和ask_answers表,定义与示例代码中相同。
步骤:
- 使用事务保证数据一致性: 使用
START TRANSACTION;和COMMIT;包裹整个插入操作,确保所有数据成功插入,或全部回滚。 - 使用游标遍历 C 表数据: 使用
DECLARE cur CURSOR FOR SELECT question_title, content FROM C;定义游标,用于遍历 C 表数据。 - 循环插入数据: 使用
LOOP和FETCH语句遍历游标中的每一条数据,并分别插入到ask_questions和ask_answers表中。 - 获取新插入数据的 ID: 使用
LAST_INSERT_ID()获取新插入的ask_questions数据的主键 ID,并将其存储到question_id变量中。 - 将
question_id插入ask_answers表: 在插入ask_answers表时,将question_id变量值作为question_id字段的值。 - 关闭游标和提交事务: 使用
CLOSE cur;关闭游标,使用COMMIT;提交事务,完成数据插入操作。
示例代码:
START TRANSACTION;
DECLARE question_id INT;
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT question_title, content FROM C;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO @question_title, @content;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO ask_questions (user_id, category_id, title, description, price, hide, answers , status, created_at, updated_at)
VALUES
(1, 7, @question_title, @question_title, 1, 1, 1,1, @timestamp1 := DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 24 + 24) HOUR), @timestamp1);
SET question_id = LAST_INSERT_ID();
INSERT INTO ask_answers (question_title, question_id, user_id, content, status, adopted_at, created_at, updated_at)
VALUES (@question_title, question_id, 1007, @content, 1, NULL, @timestamp1 := DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 24) HOUR), @timestamp1);
END LOOP;
CLOSE cur;
COMMIT;
代码说明:
START TRANSACTION;和COMMIT;包裹整个插入操作,确保数据的一致性。DECLARE cur CURSOR FOR SELECT question_title, content FROM C;定义游标,用于遍历 C 表数据。DECLARE done INT DEFAULT FALSE;和DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;用于处理游标遍历结束的情况。OPEN cur;打开游标,开始遍历数据。read_loop: LOOP和FETCH cur INTO @question_title, @content;循环遍历游标数据,并将数据存储到@question_title和@content变量中。IF done THEN LEAVE read_loop; END IF;判断游标是否遍历结束,如果结束则退出循环。INSERT INTO ask_questions (user_id, category_id, title, description, price, hide, answers , status, created_at, updated_at) VALUES (1, 7, @question_title, @question_title, 1, 1, 1,1, @timestamp1 := DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 24 + 24) HOUR), @timestamp1);将数据插入到ask_questions表中,并使用LAST_INSERT_ID()获取新插入数据的 ID。SET question_id = LAST_INSERT_ID();将新插入数据的 ID 存储到question_id变量中。INSERT INTO ask_answers (question_title, question_id, user_id, content, status, adopted_at, created_at, updated_at) VALUES (@question_title, question_id, 1007, @content, 1, NULL, @timestamp1 := DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 24) HOUR), @timestamp1);将数据插入到ask_answers表中,并将question_id变量值作为question_id字段的值。CLOSE cur;关闭游标,释放资源。COMMIT;提交事务,完成数据插入操作。
注意:
- 此代码示例仅供参考,您需要根据您的实际需求进行修改。
- 确保 C 表中数据格式与
ask_questions和ask_answers表的字段类型匹配。 - 使用
RAND()生成随机时间戳,您可以根据您的实际情况进行调整。 - 请注意数据安全,避免在生产环境中直接使用随机时间戳。
希望此教程对您有所帮助!
原文地址: http://www.cveoy.top/t/topic/lO3K 著作权归作者所有。请勿转载和采集!