MySQL 多表插入数据 - 保证数据一致性
可以使用MySQL的事务(Transaction)来实现同时向两张表插入数据,并保证数据的一致性。事务可以保证一组操作,要么全部完成,要么全部回滚,不会出现部分操作完成或失败的情况。
具体实现步骤如下:
- 开启事务:使用START TRANSACTION或BEGIN语句开启一个事务。
- 向'ask_questions'表中插入数据:使用INSERT INTO语句向'ask_questions'表中插入多条数据,并获取主键id值。
- 向'ask_answers'表中插入数据:使用INSERT INTO语句向'ask_answers'表中插入多条数据,并将'question_id'字段设置为对应的'ask_questions'表中的主键id值。
- 提交事务:使用COMMIT语句提交事务,如果以上操作全部成功,则将数据保存到数据库中。
- 回滚事务:如果以上操作中任何一步失败,则使用ROLLBACK语句回滚事务,撤销所有已完成的操作。
示例代码如下:
START TRANSACTION;
INSERT INTO ask_questions (user_id, category_id, title, description, price, hide, answers, views, followers, collections, comments, device, status, created_at, updated_at) VALUES
(1, 2, '问题1', '问题描述1', 0, 0, 0, 0, 0, 0, 0, 1, 0, NOW(), NOW()),
(2, 1, '问题2', '问题描述2', 0, 0, 0, 0, 0, 0, 0, 1, 0, NOW(), NOW()),
(3, 3, '问题3', '问题描述3', 0, 0, 0, 0, 0, 0, 0, 1, 0, NOW(), NOW());
SET @last_id = LAST_INSERT_ID();
INSERT INTO ask_answers (question_title, question_id, user_id, content, supports, oppositions, comments, device, status, adopted_at, created_at, updated_at) VALUES
('问题1回答1', @last_id, 1, '回答内容1', 0, 0, 0, 1, 0, NULL, NOW(), NOW()),
('问题1回答2', @last_id, 2, '回答内容2', 0, 0, 0, 1, 0, NULL, NOW(), NOW()),
('问题2回答1', @last_id+1, 3, '回答内容3', 0, 0, 0, 1, 0, NULL, NOW(), NOW()),
('问题2回答2', @last_id+1, 1, '回答内容4', 0, 0, 0, 1, 0, NULL, NOW(), NOW()),
('问题3回答1', @last_id+2, 2, '回答内容5', 0, 0, 0, 1, 0, NULL, NOW(), NOW()),
('问题3回答2', @last_id+2, 3, '回答内容6', 0, 0, 0, 1, 0, NULL, NOW(), NOW());
COMMIT;
上述代码中,使用LAST_INSERT_ID()函数获取上一步插入的'ask_questions'表中的主键id值,并将其赋值给变量@last_id,然后使用@last_id+1,@last_id+2等方式设置'ask_answers'表中的'question_id'字段,保证了两张表中的数据对应关系。最后使用COMMIT语句提交事务,如果以上操作全部成功,则将数据保存到数据库中。如果有任何一步操作失败,则使用ROLLBACK语句回滚事务,撤销所有已完成的操作。
原文地址: https://www.cveoy.top/t/topic/lO2g 著作权归作者所有。请勿转载和采集!