MySQL多库图书表合并:如何同步toc表的关联book_id
合并多库图书数据的解决方案
情况1:books表的id是自增主键
这种情况下,插入library1的books后会生成新的id,需要先建立旧id和新id的映射关系:
- 创建临时映射表
用来存储library2图书id与library1中对应新id的映射:
CREATE TEMPORARY TABLE book_id_mapping ( old_book_id INT, new_book_id INT );
- 插入books数据并生成映射
先将library2的books数据插入library1(显式指定字段避免id字段冲突):
INSERT INTO library1.books (title, isbn, publisher, city) SELECT title, isbn, publisher, city FROM library2.books;
然后通过唯一标识字段(比如isbn,若isbn不唯一,可使用title+publisher+city这类组合条件)关联,生成映射关系:
INSERT INTO book_id_mapping (old_book_id, new_book_id) SELECT b2.id AS old_book_id, b1.id AS new_book_id FROM library2.books b2 JOIN library1.books b1 ON b2.isbn = b1.isbn -- 可选:添加更多匹配条件保障唯一性 -- AND b2.title = b1.title -- AND b2.publisher = b1.publisher;
- 插入toc数据并替换book_id
利用映射表将library2的toc数据关联到library1的新book_id:
INSERT INTO library1.toc (chapter, book_id) SELECT toc.chapter, bm.new_book_id FROM library2.toc toc JOIN book_id_mapping bm ON toc.book_id = bm.old_book_id;
情况2:books表的id不是自增主键(可手动调整)
如果id是自定义且允许修改,可通过给library2的id加偏移量避免冲突:
- 获取library1的最大book_id
SELECT MAX(id) FROM library1.books;
假设查询结果为max_id = 1000。
- 插入books数据(偏移id)
给library2的所有book_id加上偏移量后插入:
INSERT INTO library1.books (id, title, isbn, publisher, city) SELECT id + 1000, title, isbn, publisher, city FROM library2.books;
- 插入toc数据(同步偏移book_id)
将toc中的book_id同样加上偏移量后插入:
INSERT INTO library1.toc (chapter, book_id) SELECT chapter, book_id + 1000 FROM library2.toc;
注意事项
- 操作前务必备份所有数据库,防止数据丢失。
- 如果存在重复书籍(比如library1已有相同isbn的书),插入books时可使用
INSERT ... ON DUPLICATE KEY UPDATE避免重复插入,此时映射表会自动关联到library1已有的book_id。 - 若有多个子库(library3、library4等),重复上述步骤即可逐个合并。
内容的提问来源于stack exchange,提问作者user934820
相关产品推荐
相关产品推荐

