MySQL 5.7 事务插入数据:将 C 表数据导入 ask_questions 和 ask_answers 表

本文将介绍如何使用 MySQL 5.7 事务将 C 表中的数据导入 ask_questionsask_answers 表,并保证 question_idask_questions 表主键 id 的一一对应关系。

假设您有一个名为 C 的表,表中只有 '问题标题''问题答案' 两个字段,现在需要将 C 表中的数据插入到以下两个表:

  • ask_questions:包含问题相关信息,例如用户 ID、分类 ID、问题标题、问题描述等;
  • ask_answers:包含问题答案相关信息,例如问题标题、问题 ID、用户 ID、答案内容等;

为了保证数据的完整性和一致性,可以使用事务操作。以下代码示例展示了如何使用游标和循环语句,将 C 表中的数据逐条插入到两个表中,并保证 question_idask_questions 表主键 id 的一一对应关系:

START TRANSACTION;

DECLARE c_title VARCHAR(255);
DECLARE c_answer VARCHAR(255);
DECLARE c_finished BOOLEAN DEFAULT FALSE;
DECLARE c_cursor CURSOR FOR SELECT '问题标题', '问题答案' FROM C;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET c_finished = TRUE;

OPEN c_cursor;

loop_records: LOOP
    FETCH c_cursor INTO c_title, c_answer;
    IF c_finished THEN
        LEAVE loop_records;
    END IF;

    INSERT INTO ask_questions (user_id, category_id, title, description, price, hide, answers , status, created_at, updated_at)
    VALUES 
        (1, 7, c_title, c_title, 1, 1, 1, 1, @timestamp := DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 24 + 24) HOUR), @timestamp),
    (1, 7, c_title, c_title, 1, 1, 1, 1, @timestamp := DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 24 + 24) HOUR), @timestamp);

    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 (c_title, @question_id, 1007, c_answer, 1, NULL, @timestamp := DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 24) HOUR), @timestamp);

END LOOP;

CLOSE c_cursor;

COMMIT;

代码解释:

  1. START TRANSACTION;: 开始一个事务,保证数据操作的原子性。

  2. DECLARE c_title VARCHAR(255);: 声明一个变量 c_title 用于存储 C 表中的 '问题标题'

  3. DECLARE c_answer VARCHAR(255);: 声明一个变量 c_answer 用于存储 C 表中的 '问题答案'

  4. DECLARE c_finished BOOLEAN DEFAULT FALSE;: 声明一个布尔变量 c_finished 用于标记是否遍历完 C 表的所有数据。

  5. DECLARE c_cursor CURSOR FOR SELECT '问题标题', '问题答案' FROM C;: 声明一个游标 c_cursor 用于遍历 C 表中的数据。

  6. DECLARE CONTINUE HANDLER FOR NOT FOUND SET c_finished = TRUE;: 设置一个异常处理程序,当游标遍历到 C 表的末尾时,将 c_finished 设置为 TRUE

  7. OPEN c_cursor;: 打开游标。

  8. loop_records: LOOP ... END LOOP;: 使用循环语句遍历 C 表中的数据。

  9. FETCH c_cursor INTO c_title, c_answer;: 从游标中获取当前行的 '问题标题''问题答案',并存储到 c_titlec_answer 变量中。

  10. IF c_finished THEN ... END IF;: 如果遍历到 C 表的末尾,则退出循环。

  11. INSERT INTO ask_questions ... VALUES ...;: 将当前行的 '问题标题' 插入到 ask_questions 表中。

  12. SET @question_id = LAST_INSERT_ID();: 获取 ask_questions 表中新插入的记录的 id,并将其存储到变量 @question_id 中。

  13. INSERT INTO ask_answers ... VALUES ...;: 将当前行的 '问题标题'@question_id 插入到 ask_answers 表中,保证 question_idask_questions 表主键 id 的一一对应关系。

  14. CLOSE c_cursor;: 关闭游标。

  15. COMMIT;: 提交事务,将所有操作永久保存到数据库中。

注意事项:

  • 上述代码中,'问题标题''问题答案' 是 C 表中字段的名称,请根据实际情况修改。
  • 代码中的 user_id, category_id, price, hide, answers, status 等参数值请根据实际情况进行修改。
  • 代码中使用了 DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 24 + 24) HOUR) 生成随机的 created_at 和 updated_at 值,请根据实际情况进行修改。

总结:

本文介绍了如何使用 MySQL 5.7 事务将 C 表中的数据导入 ask_questionsask_answers 表,并保证 question_idask_questions 表主键 id 的一一对应关系。代码示例使用了循环语句和游标,并详细解释了代码逻辑。希望本文能帮助您更好地理解 MySQL 事务操作和数据导入的方法。

MySQL 5.7 事务插入数据:将 C 表数据导入 ask_questions 和 ask_answers 表

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

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