使用事务和循环将数据从 C 表导入 ask_questions 和 ask_answers 表

本教程演示如何在 MySQL 数据库中,使用事务和循环的方式,将一个名为 C 的表中的数据批量导入到 ask_questionsask_answers 表中,确保每个问题标题与答案的对应关系。

前提:

  • 现有 C 表,包含 问题标题问题答案 两个字段,其中包含 100 条数据。
  • 现有 ask_questionsask_answers 表,定义与示例代码中相同。

步骤:

  1. 使用事务保证数据一致性: 使用 START TRANSACTION;COMMIT; 包裹整个插入操作,确保所有数据成功插入,或全部回滚。
  2. 使用游标遍历 C 表数据: 使用 DECLARE cur CURSOR FOR SELECT question_title, content FROM C; 定义游标,用于遍历 C 表数据。
  3. 循环插入数据: 使用 LOOPFETCH 语句遍历游标中的每一条数据,并分别插入到 ask_questionsask_answers 表中。
  4. 获取新插入数据的 ID: 使用 LAST_INSERT_ID() 获取新插入的 ask_questions 数据的主键 ID,并将其存储到 question_id 变量中。
  5. question_id 插入 ask_answers: 在插入 ask_answers 表时,将 question_id 变量值作为 question_id 字段的值。
  6. 关闭游标和提交事务: 使用 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: LOOPFETCH 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_questionsask_answers 表的字段类型匹配。
  • 使用 RAND() 生成随机时间戳,您可以根据您的实际情况进行调整。
  • 请注意数据安全,避免在生产环境中直接使用随机时间戳。

希望此教程对您有所帮助!

MySQL 批量插入数据:将 C 表数据导入 ask_questions 和 ask_answers 表

原文地址: http://www.cveoy.top/t/topic/lO3K 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录