You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL多库图书表合并:如何同步toc表的关联book_id

合并多库图书数据的解决方案

情况1:books表的id是自增主键

这种情况下,插入library1的books后会生成新的id,需要先建立旧id和新id的映射关系:

  1. 创建临时映射表
    用来存储library2图书id与library1中对应新id的映射:
CREATE TEMPORARY TABLE book_id_mapping (
    old_book_id INT,
    new_book_id INT
);
  1. 插入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;
  1. 插入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加偏移量避免冲突:

  1. 获取library1的最大book_id
SELECT MAX(id) FROM library1.books;

假设查询结果为max_id = 1000。

  1. 插入books数据(偏移id)
    给library2的所有book_id加上偏移量后插入:
INSERT INTO library1.books (id, title, isbn, publisher, city)
SELECT id + 1000, title, isbn, publisher, city FROM library2.books;
  1. 插入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:00:26