MySQL 5.7 事务插入数据:将 C 表数据导入 ask_questions 和 ask_answers 表
MySQL 5.7 事务插入数据:将 C 表数据导入 ask_questions 和 ask_answers 表
本文将介绍如何使用 MySQL 5.7 事务将 C 表中的数据导入 ask_questions 和 ask_answers 表,并保证 question_id 与 ask_questions 表主键 id 的一一对应关系。
假设您有一个名为 C 的表,表中只有 '问题标题' 和 '问题答案' 两个字段,现在需要将 C 表中的数据插入到以下两个表:
ask_questions:包含问题相关信息,例如用户 ID、分类 ID、问题标题、问题描述等;ask_answers:包含问题答案相关信息,例如问题标题、问题 ID、用户 ID、答案内容等;
为了保证数据的完整性和一致性,可以使用事务操作。以下代码示例展示了如何使用游标和循环语句,将 C 表中的数据逐条插入到两个表中,并保证 question_id 与 ask_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;
代码解释:
-
START TRANSACTION;: 开始一个事务,保证数据操作的原子性。 -
DECLARE c_title VARCHAR(255);: 声明一个变量c_title用于存储 C 表中的'问题标题'。 -
DECLARE c_answer VARCHAR(255);: 声明一个变量c_answer用于存储 C 表中的'问题答案'。 -
DECLARE c_finished BOOLEAN DEFAULT FALSE;: 声明一个布尔变量c_finished用于标记是否遍历完 C 表的所有数据。 -
DECLARE c_cursor CURSOR FOR SELECT '问题标题', '问题答案' FROM C;: 声明一个游标c_cursor用于遍历 C 表中的数据。 -
DECLARE CONTINUE HANDLER FOR NOT FOUND SET c_finished = TRUE;: 设置一个异常处理程序,当游标遍历到 C 表的末尾时,将c_finished设置为TRUE。 -
OPEN c_cursor;: 打开游标。 -
loop_records: LOOP ... END LOOP;: 使用循环语句遍历 C 表中的数据。 -
FETCH c_cursor INTO c_title, c_answer;: 从游标中获取当前行的'问题标题'和'问题答案',并存储到c_title和c_answer变量中。 -
IF c_finished THEN ... END IF;: 如果遍历到 C 表的末尾,则退出循环。 -
INSERT INTO ask_questions ... VALUES ...;: 将当前行的'问题标题'插入到ask_questions表中。 -
SET @question_id = LAST_INSERT_ID();: 获取ask_questions表中新插入的记录的 id,并将其存储到变量@question_id中。 -
INSERT INTO ask_answers ... VALUES ...;: 将当前行的'问题标题'和@question_id插入到ask_answers表中,保证question_id与ask_questions表主键 id 的一一对应关系。 -
CLOSE c_cursor;: 关闭游标。 -
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_questions 和 ask_answers 表,并保证 question_id 与 ask_questions 表主键 id 的一一对应关系。代码示例使用了循环语句和游标,并详细解释了代码逻辑。希望本文能帮助您更好地理解 MySQL 事务操作和数据导入的方法。
原文地址: http://www.cveoy.top/t/topic/lO3J 著作权归作者所有。请勿转载和采集!