MySQL实现UPSERT操作:从INSERT ON DUPLICATE KEY UPDATE到临时表方案详解
1. 从一个常见的业务场景说起做后端开发或者数据处理的同学肯定遇到过这样的场景有一张用户信息表每天会从上游系统同步过来一批最新的用户数据。这批数据里有些用户是全新的需要插入到我们的表里有些用户的信息发生了变更比如手机号、地址更新了我们需要更新表中对应的记录还有一些用户可能在上游系统里被删除了我们需要相应地做逻辑删除。这个“有则更新无则插入”的操作在数据库领域有个专门的术语叫做“UPSERT”Update Insert。如果你用的是 Oracle 或者 PostgreSQL 12可能会很自然地想到MERGE INTO这个强大的 SQL 语句。它就像一把瑞士军刀一条语句就能搞定条件判断、更新和插入逻辑清晰执行高效。但当你把目光转向 MySQL 时会发现一个尴尬的事实MySQL 官方并没有提供MERGE INTO语句。很多从其他数据库转过来的开发者第一个撞上的就是这堵墙。那么在 MySQL 里我们该如何优雅地实现MERGE INTO的功能呢今天我们就来深入聊聊这个话题。我会结合自己多年在数据同步、流水对账等场景下的实战经验为你拆解几种主流实现方案的原理、适用场景以及那些容易踩坑的细节。无论你是要处理每日的用户增量同步还是高频的订单状态更新这篇文章都能给你一份可以直接“抄作业”的指南。2. 理解“UPSERT”的核心与MySQL的“缺席”在深入方案之前我们有必要先搞清楚MERGE INTO或者说 UPSERT 操作到底在解决什么问题以及为什么 MySQL 的选择如此不同。2.1 UPSERT 的本质避免“先查后改”的范式在没有 UPSERT 语法的世界里我们实现“存在则更新不存在则插入”的逻辑通常需要遵循一个“先查后改”的范式SELECT根据唯一键如用户ID去数据库里查询这条记录是否存在。分支判断如果存在SELECT ... FOR UPDATE则执行UPDATE。如果不存在则执行INSERT。事务控制为了保证在“查”和“改”之间数据不被其他事务修改我们通常需要开启一个事务甚至使用SELECT ... FOR UPDATE进行行锁防止并发下的数据不一致。这个过程不仅代码冗长需要编写分支逻辑更重要的是存在性能和并发问题。网络往返次数多先一次查询再一次更新/插入在高并发下针对同一行数据的“查-改”序列容易引发锁竞争甚至死锁。MERGE INTO的价值就在于它将这个多步操作原子化、声明化了。你只需要告诉数据库“以这张源表的数据为准去操作目标表如果匹配上唯一键就更新匹配不上就插入”。数据库优化器会以更高效、更安全的方式去执行这个操作。2.2 MySQL 的哲学与REPLACE的陷阱MySQL 没有MERGE INTO与其设计哲学有一定关系。MySQL 更倾向于提供简单、明确的原子操作复杂的多步骤逻辑有时通过应用层或组合语句来实现。不过它提供了一个乍看很像 UPSERT 的语句REPLACE INTO。REPLACE INTO的工作方式非常“粗暴”尝试根据主键或唯一索引插入数据。如果发生重复键冲突它会先删除DELETE冲突的那一行然后再插入INSERT新的数据。这带来了几个严重问题主键ID变化对于自增主键AUTO_INCREMENT新插入的行会获得一个全新的、更大的ID这可能会破坏以外键关联的其他数据。触发器被错误触发DELETE和INSERT操作会分别触发对应的触发器而你的业务逻辑可能并未预料到一次更新会触发删除事件。性能开销一次REPLACE可能相当于一次DELETE加一次INSERT比单纯的UPDATE开销更大。语义失真对于审计日志或某些状态字段如create_time你本意可能是更新但REPLACE会将其重置为插入时的值。因此在大多数需要“更新”语义的场景下REPLACE INTO并不是一个合适的替代品。我们需要更精细的方案。3. 方案一INSERT ... ON DUPLICATE KEY UPDATE(ODKU) 详解这是 MySQL 中实现 UPSERT 功能最常用、最被推荐的方式。它的语法直白地揭示了其意图“插入当发生重复键冲突时则执行更新”。3.1 基础语法与执行逻辑INSERT INTO target_table (col1, col2, col3, ...) VALUES (val1, val2, val3, ...) ON DUPLICATE KEY UPDATE col1 VALUES(col1), col2 VALUES(col2), -- ... 其他需要更新的列执行流程可以这样理解数据库引擎尝试执行标准的INSERT操作。如果插入过程中由于主键冲突或唯一索引冲突导致失败引擎并不会报错回滚。它会转而执行ON DUPLICATE KEY UPDATE子句中定义的更新操作。这里的VALUES(col_name)是一个特殊的函数它引用的是原本试图插入的那个值而不是当前表中的值。这一点至关重要。3.2 单条与批量处理单条处理就是上面的例子清晰简单。批量处理是 ODKU 威力巨大的地方可以极大减少网络交互INSERT INTO user (id, name, email, last_login) VALUES (1, 张三, zhangsanexample.com, 2023-10-27), (2, 李四, lisiexample.com, 2023-10-27), (3, 王五, wangwuexample.com, 2023-10-27) ON DUPLICATE KEY UPDATE name VALUES(name), email VALUES(email), last_login VALUES(last_login);这条语句会一次性尝试插入三条数据。假设 ID 为 1 和 2 的用户已存在ID 为 3 的用户是新用户。那么这条语句的执行结果是更新了 ID 为 1 和 2 的两条记录插入了 ID 为 3 的新记录。所有操作在一个 SQL 回合内完成。3.3 进阶技巧与注意事项如何知道是插入还是更新ODKU 语句的返回值affected_rows有特殊含义如果返回 1表示执行了插入。如果返回 2表示执行了更新1行被更新但 MySQL 将“删除旧行插入新行”计为2行受影响在 InnoDB 引擎下通常更新返回2。如果返回 0表示更新操作执行了但新数据和旧数据完全一样没有实际变化。 你可以通过客户端获取这个值来判断操作类型。只更新部分列或进行条件更新UPDATE子句非常灵活。ON DUPLICATE KEY UPDATE last_login VALUES(last_login), -- 总是更新最后登录时间 login_count IF(VALUES(last_login) last_login, login_count 1, login_count) -- 只有在新时间更晚时才增加计数这里用IF函数实现了条件更新。VALUES()函数的局限在UPDATE子句中VALUES()只能引用试图插入的列值。如果你想基于当前行的其他列进行计算可以直接使用列名。ON DUPLICATE KEY UPDATE total_amount total_amount VALUES(increment_amount) -- 累加操作最大的“坑”多个唯一索引。如果表上有多个唯一索引例如主键id和唯一索引uk_email当插入的数据与任何一个唯一索引冲突时都会触发UPDATE。但问题在于UPDATE只会更新一行数据即第一个引发冲突的索引所在的那一行。这可能导致非预期的行为。例如你想插入(id5, emailab.com)但表中已存在(id10, emailab.com)邮箱冲突。ODKU 会更新id10的那一行将其id改为 5不这会造成主键冲突语句会失败。因此在设计表结构时如果要用 ODKU需要仔细考虑唯一索引的设置。实操心得ODKU 是处理每日增量数据同步的利器。我们有一个用户行为日志日更表每天用 ODKU 批量更新数百万条记录性能比应用层循环判断高出几个数量级。但务必在测试环境模拟并发冲突确认多个唯一索引下的行为符合预期。4. 方案二INSERT IGNORE的适用场景与局限INSERT IGNORE是另一种思路。它的语义是“插入如果发生错误如重复键冲突忽略这个错误继续执行。”4.1 语法与行为INSERT IGNORE INTO target_table (col1, col2, ...) VALUES (val1, val2, ...), (val3, val4, ...), ...;当插入过程中遇到重复键错误时MySQL 会将其降级为一个警告Warning而不是错误Error语句会继续执行跳过冲突行插入剩余行。4.2 它解决了什么问题局限在哪INSERT IGNORE非常适合一种场景“只插入新数据旧数据原封不动”。例如记录用户设备ID的表同一个设备只记录第一次出现的时间后续再出现直接忽略。或者用于初始化数据确保不会因为重复执行脚本而插入重复数据。但是它的局限性非常明显无法更新它只能忽略冲突不能更新已有数据。如果你的需求是“更新”它完全不适用。忽略所有错误它不仅忽略重复键错误还会忽略其他一些非致命错误如数据类型转换截断。这可能会掩盖数据质量问题导致数据 silently 丢失或变形。返回值模糊affected_rows只返回实际插入的行数你无法知道有多少行因为冲突被忽略了。4.3 与 ODKU 的对比选型特性INSERT ... ON DUPLICATE KEY UPDATEINSERT IGNORE核心语义存在则更新不存在则插入存在则忽略不存在则插入是否更新数据是否错误处理将重复键冲突转为更新路径将重复键冲突降级为警告适用场景需要同步最新数据的场景用户信息、订单状态、计数器只需去重插入的场景首次记录、初始化数据、日志去重灵活性高可自定义更新逻辑低只有“忽略”一种行为所以当你需要真正的“更新”语义时INSERT IGNORE通常不是正确选择ODKU才是主力。5. 方案三通过事务与存储过程模拟在一些更复杂的情况下比如需要根据源表和目标表多个字段进行复杂匹配而不只是唯一键相等或者业务逻辑无法用简单的 ODKU 表达时我们可以退一步用事务和存储过程来模拟MERGE的流程。这给了我们最大的控制权。5.1 应用层事务模拟思路就是在应用代码里显式地开启事务执行“先查后改”的流程但通过数据库锁来保证安全。-- 伪代码示意假设使用编程语言如Go/Python控制流程 START TRANSACTION; -- 1. 使用 FOR UPDATE 锁定可能涉及的行防止其他事务并发修改 SELECT * FROM target_table WHERE unique_key ? FOR UPDATE; -- 2. 应用层判断查询结果 if row_exists: -- 3. 执行更新 UPDATE target_table SET ... WHERE unique_key ?; else: -- 4. 执行插入 INSERT INTO target_table ...; end if COMMIT;优点逻辑清晰可处理任意复杂的匹配和更新逻辑。缺点性能差至少需要两次数据库交互SELECT UPDATE/INSERT网络开销和锁持有时间都更长。死锁风险高并发下多个事务对相同资源行以不同顺序加锁容易导致死锁。代码复杂需要手动处理所有异常和回滚逻辑。5.2 存储过程封装将上述逻辑封装到 MySQL 存储过程中可以减少网络交互次数但将复杂度转移到了数据库层。DELIMITER // CREATE PROCEDURE sp_merge_user( IN p_id INT, IN p_name VARCHAR(100), IN p_email VARCHAR(100) ) BEGIN DECLARE v_exists INT DEFAULT 0; -- 检查记录是否存在 SELECT COUNT(*) INTO v_exists FROM user WHERE id p_id FOR UPDATE; IF v_exists 0 THEN UPDATE user SET name p_name, email p_email, update_time NOW() WHERE id p_id; ELSE INSERT INTO user (id, name, email, create_time) VALUES (p_id, p_name, p_email, NOW()); END IF; END // DELIMITER ;优点一次网络调用逻辑在数据库内完成对应用透明。缺点存储过程调试和维护相对困难。复杂逻辑的存储过程可能性能不佳。数据库版本升级或迁移时存储过程可能成为负担。踩坑实录我们曾在某个古老系统中使用过存储过程实现复杂的多表 MERGE 逻辑。初期运行良好但随着数据量增长和逻辑复杂化该存储过程成了性能瓶颈和 bug 温床。最终我们花了大力气将其重构为应用层分步处理 批量 ODKU 的组合性能提升了十倍可维护性也大大增强。我的建议是除非有极强的理由如极致的性能要求或历史包袱否则应优先使用 ODKU谨慎使用存储过程。6. 方案四临时表与多语句组合处理复杂数据源当你的源数据不是简单的几条值而是来自一个复杂的查询、另一个表或者一个外部文件时直接使用 ODKU 可能不方便。这时“临时表多语句”的组合拳就派上用场了。这个方案的典型步骤是创建临时表或内存表用于暂存源数据。加载数据将源数据通过INSERT INTO ... SELECT或LOAD DATA导入临时表。执行批量更新使用UPDATE ... JOIN语句将临时表与目标表关联更新所有匹配的记录。执行批量插入使用INSERT INTO ... SELECT ... WHERE NOT EXISTS语句将临时表中不匹配的记录插入目标表。6.1 实战演练从订单明细表更新商品销量假设我们有一个商品表productsid,name,sales_volume和一个订单明细表order_itemsproduct_id,quantity。我们需要根据当日的订单明细更新商品的累计销量。-- 步骤1创建临时表存储当日各商品销量汇总 CREATE TEMPORARY TABLE tmp_daily_sales ( product_id INT PRIMARY KEY, daily_quantity INT NOT NULL ); -- 步骤2从订单明细表汇总数据到临时表 INSERT INTO tmp_daily_sales (product_id, daily_quantity) SELECT product_id, SUM(quantity) FROM order_items WHERE order_date CURDATE() GROUP BY product_id; -- 步骤3更新商品表增加销量 UPDATE products p INNER JOIN tmp_daily_sales t ON p.id t.product_id SET p.sales_volume p.sales_volume t.daily_quantity; -- 步骤4插入新商品这里不需要因为商品表应该已包含所有商品。 -- 如果需要插入新商品可以这样 -- INSERT INTO products (id, name, sales_volume) -- SELECT t.product_id, New Product, t.daily_quantity -- FROM tmp_daily_sales t -- LEFT JOIN products p ON t.product_id p.id -- WHERE p.id IS NULL; -- 找出临时表里有但商品表里没有的 -- 步骤5清理临时表连接结束后自动销毁也可手动 DROP TEMPORARY TABLE tmp_daily_sales;6.2 方案评价与适用场景优点处理能力强可以应对非常复杂的源数据逻辑所有预处理在临时表中完成。步骤清晰将“更新”和“插入”分离逻辑上更易于理解和调试。性能尚可批量操作减少了应用层与数据库的交互次数。缺点非原子性UPDATE和INSERT是分开的语句如果执行到一半失败可能导致数据不一致。需要放在一个事务中执行。需要处理重复在“先更新后插入”的过程中如果有其他并发操作可能产生竞态条件。通常需要加锁或使用更严格的隔离级别。代码量多相比 ODKU 一条语句这个方案需要多条语句和临时表管理。适用场景源数据需要复杂清洗、聚合需要更新的逻辑和需要插入的逻辑差别很大数据量极大使用 ODKU 的批量插入可能超出max_allowed_packet限制时可以分批次加载到临时表再处理。7. 并发控制、性能与选型终极指南在真实的生产环境中选择哪种方案绝不仅仅是语法层面的偏好更需要考虑并发安全性和性能表现。7.1 并发下的数据安全INSERT ... ON DUPLICATE KEY UPDATE在 InnoDB 引擎下它本质上是“插入或更新”的原子操作。当发生冲突时它会获取目标行的 X 锁排他锁。对于批量操作锁的粒度是行级但大量并发操作同一批数据时仍可能引发死锁。建议尽量按主键顺序进行批量操作可以减少死锁概率。应用层/存储过程模拟最危险因为SELECT ... FOR UPDATE和后续的UPDATE/INSERT之间存在时间差即使加锁错误的逻辑顺序也可能导致死锁。必须精心设计事务流程。临时表方案UPDATE ... JOIN和INSERT ... SELECT在执行时会锁定涉及的行。如果整个操作包裹在事务中可以保证一致性但锁的持有时间较长。通用建议对于高并发 UPSERT优先使用 ODKU。如果业务允许采用“消息队列批量任务”的方式将并发的单条操作聚合成低频率的批量操作可以极大缓解数据库压力。7.2 性能考量小批量、高频次单条或小批量几十条的 UPSERTODKU 性能最佳网络开销最小。大批量数据同步如果数据可以组织成批量值列表且不超过max_allowed_packetODKU 批量操作是性能王者。如果数据量极大百万级以上使用LOAD DATA INFILE将数据快速导入临时表再通过“临时表多语句”的方式处理往往更高效因为避免了构建巨型 SQL 字符串的开销。索引的影响UPSERT 操作会触发索引的维护。目标表上的唯一索引越多ODKU 检查冲突的成本就越高。不必要的索引会影响性能。7.3 最终选型决策树面对一个 UPSERT 需求你可以遵循以下决策路径是否需要“更新”已有数据否- 考虑INSERT IGNORE仅去重插入。是- 进入第2步。源数据是否简单值列表或简单查询目标表是否有明确的唯一键主键或唯一索引是-首选INSERT ... ON DUPLICATE KEY UPDATE。这是 MySQL 中最优雅、性能最好的解决方案。否- 进入第3步。匹配逻辑是否复杂非等值匹配、多表关联或者数据量是否极其庞大是- 考虑“临时表 UPDATE JOIN/INSERT ... SELECT NOT EXISTS”组合方案。将复杂逻辑拆解到临时表中。否- 进入第4步。是否有极其特殊的业务逻辑上述方案都无法满足是- 谨慎评估使用应用层事务控制或存储过程。务必做好并发测试和死锁检测。否- 回到第2步重新审视需求大概率 ODKU 可以解决。记住没有银弹。最好的方案总是来自于对业务需求、数据特性和数据库行为的深刻理解。在关键业务上线前用生产环境的数据量和并发模式进行压力测试是避免线上事故的最后一道也是最重要的一道防线。

相关新闻

第5章 ArkUI(下)

第5章 ArkUI(下)

在UI开发中,开发者经常会遇到编写相似或重复代码的情况,以确保整体外观和样式的一致性。ArkUI提供了渲染语句、组件的导出和导入、组件代码复用等功能,可以帮助开发者减少编写相似或重复代码的情况,同时确保整体外观和样式的一致性。本章将对ArkUI进阶知识进行详细讲解。 …

2026/10/17 3:26:51 阅读更多 →
ncmdumpGUI快速上手:5分钟把网易云NCM歌曲转成通用格式

ncmdumpGUI快速上手:5分钟把网易云NCM歌曲转成通用格式

ncmdumpGUI快速上手:5分钟把网易云NCM歌曲转成通用格式 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 前阵子朋友找我诉苦:他从网易云…

2026/10/7 7:37:30 阅读更多 →
AI Agent工程化实践:从Skill生命周期管理到AgentLoop闭环

AI Agent工程化实践:从Skill生命周期管理到AgentLoop闭环

1. 从“一次性玩具”到“生产级资产”:为什么我们需要AI Agent的工程化链路?如果你最近也在折腾AI Agent,大概率经历过这样的场景:灵光一现,用LangChain、AutoGen或者某个新框架,花一下午写了个能联网搜索、…

2026/10/7 7:37:26 阅读更多 →

最新新闻

从补码到整数溢出:理解计算机中的二进制位模式与类型解释

从补码到整数溢出:理解计算机中的二进制位模式与类型解释

1. 先从一次“诡异”的减一操作聊起大概很多人在写倒计时逻辑时都遇到过这种见鬼的事:一个普通的整数变量,减到 0 之后继续减,下一瞬间变成了 4294967295。第一次看到这个数字时我还以为程序算错了,甚至怀疑是内存被改。后来静下心…

2026/10/17 3:26:50 阅读更多 →
GD32F470六路串口并行驱动:DMA双缓冲+IDLE中断零丢包方案

GD32F470六路串口并行驱动:DMA双缓冲+IDLE中断零丢包方案

简介:本资源是一套基于GD32F470高性能MCU实现六路UART异步串口通信的完整嵌入式工程,面向嵌入式初学者、GD32开发工程师及高校电赛/课程设计实践者,重点解决多串口并发收发中中断优先级配置、环形缓冲区管理、流控制策略与中断服务程序可靠性…

2026/10/17 3:26:50 阅读更多 →
Activiti ACT_RU_JOB表深度拆解:定时器、异步作业与运维排查实战

Activiti ACT_RU_JOB表深度拆解:定时器、异步作业与运维排查实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 3:26:50 阅读更多 →
GD32F470六路串口实战:工业级非阻塞通信中间件设计

GD32F470六路串口实战:工业级非阻塞通信中间件设计

简介:本资源是一套基于GD32F470高性能MCU实现六路UART异步串口通信的完整嵌入式工程,面向嵌入式初学者、GD32开发工程师及高校电赛/课程设计实践者,解决多串口并发收发中中断优先级配置、环形缓冲区管理、流控制与中断服务高效响应等典型难点…

2026/10/17 3:26:50 阅读更多 →
PT模拟物联网设备数据上云:本地桥接脚本全解析

PT模拟物联网设备数据上云:本地桥接脚本全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 3:26:50 阅读更多 →
微信本地聊天记录结构化导出:从.db解密到Obsidian双链笔记

微信本地聊天记录结构化导出:从.db解密到Obsidian双链笔记

1. 项目本质与真实价值:不是“微信开源”,而是打通本地知识流的桥梁很多人看到标题里的“开源微信流”第一反应是:微信官方把聊天记录协议开源了?或者有某个项目逆向出了微信PC端的完整通信协议?这完全是个误解。微信作…

2026/10/17 3:25:49 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →