MySQL自增ID全解析:DELETE与TRUNCATE如何影响AUTO_INCREMENT
1. 拆解自增序列AUTO_INCREMENT到底在“记”什么1.1 自增计数器与数据行其实是“两套账”很多人在刚接触MySQL的时候都会默认认为自增ID是跟着数据行走的插了一条数据ID加一删掉最后那条数据ID就该减回来。这个直觉在业务很小的时候看起来是对的但一旦你开始执行DELETE、TRUNCATE就会立刻发现这个直觉靠不住——删光了表里的所有行再次插入时ID往往不是从1开始而是接着原来的最大值继续走。要理解这个现象得先搞清楚InnoDB引擎里自增序列的存储方式。InnoDB为每张带AUTO_INCREMENT列的表维护了一个持久化的计数器这个计数器记录的是“下一个要分配的值”它和数据行的物理存储完全分离。你往表里插数据计数器往上加你删除某一行计数器并不会因为那一行被删掉就往下减。就像一本发票存根开出去的发票编号不会因为客户退票就重新启用之前的编号下一张依然是从当前序列接着开。这个设计本质上是为了并发安全和索引效率。自增主键要保证在分布式和并发场景下不会分配出重复的ID计数器的更新必须独立于事务的提交与回滚。如果每删一行就要回溯计数器那么两个并发事务同时插入就会出现ID冲突代价反而更高。所以MySQL在MySQL 8.0之前把计数器的最大值持久化在内存里每次重启后通过扫描表里的最大ID来重新初始化MySQL 8.0开始把自增计数器的变化写入了重做日志做到了真正的持久化重启后不会丢失。MySQL 8.0之前重启后InnoDB会执行类似SELECT MAX(auto_inc_col)的扫描来恢复计数器所以如果你在重启前删掉了最大ID的行重启后计数器可能比内存中的值小。 MySQL 8.0之后计数器实时持久化重启行为更稳定但DELETE依然不回退计数器。1.2 自增值的恢复机制为什么重启后还不一样这里有个容易让人懵的细节。比如一张表当前最大ID是100你执行了DELETE语句删掉了ID为100的那一行内存里的计数器依然是101。此时进程不重启下一次插入会得到101这是大多数人的预期。但如果这时候数据库发生了重启老版本MySQL就会重新扫描表里的最大ID——表中最大ID变成了99那么下一个插入就会拿到100而不是101。这就会造成一种“同一个表重启前后自增ID不一样”的诡异现象。很多人排查半天最后发现是重启惹的祸。MySQL 8.0以后这个情况有了很大的改变因为计数器的变更会持久化到重做日志中重启后不再需要依赖扫描表数据来推算下一个ID减少了不确定性。不过这里有一个必须提醒的边界即使MySQL 8.0做了持久化对于TRUNCATE操作来说计数器依然会被显式重置。TRUNCATE之所以能重置自增是因为它本质上是“删掉表再重建”新表结构中自增计数器的初始值被重置为默认值。这个逻辑和DELETE有着根本性的区别也是本文后续所有“坑”的根源。2. DELETE与TRUNCATE的本质差异不只是“删除”那么简单2.1 DELETE是逐行标记删除TRUNCATE直接重建表从执行方式上看DELETE是DML操作逐行把符合条件的记录标记为删除表结构、索引文件、表空间文件本身都还在原地数据页只是被标记为“可复用”。TRUNCATE是DDL操作它做的事情更接近“把这张表原地格式化”会直接重建表结构释放原有数据页并重新分配一个新的表文件片段。为了效率TRUNCATE往往不会逐行检查条件所以你没法在TRUNCATE语句里加WHERE条件——它要么清空整张表要么不做。这个底层差异直接导致两个截然不同的结果。第一DELETE删掉的行所占用的空间不会立即返还给操作系统数据页还被保留着供后续插入复用TRUNCATE则是一次性释放所有数据页空间归还给表空间所以通常TRUNCATE之后表文件大小会明显缩小。第二DELETE走的是事务日志每删一行都会记录一条undo日志这张表上的每个删除操作都可以回滚TRUNCATE则是直接重建数据字典旧的undo信息对TRUNCATE操作基本上没有回滚能力。2.2 自增计数器在两种操作下的命运自增计数器跟着表结构走。用DELETE删除所有行表结构没有发生变化计数器也原封不动。用TRUNCATE清空表表结构被重建计数器自然被重置为初始值。这就是“delete之后ID继续增长truncate之后ID从1开始”的原因。这种差异在业务上能带来很多看得见摸得着的问题。举个例子运营后台有一张日志表每周执行一次DELETE清理数据保留最近7天结果自增ID一路飙升从几千涨到了几百万——看着吓人其实只是DELETE不清计数器的正常表现。另一张临时表业务方每次跑批前用TRUNCATE清一遍ID每次从1开始跑批程序如果没注意ID复用很可能把上一次跑批留下的硬编码ID给关联错。3. 实操中最容易踩的五个坑逐个剖析3.1 DELETE清表后ID接着涨页面显示“天文数字”这是最常见的一种现象。一张只有几百行数据的小表因为反复做“插入-删除-再插入”的联调测试自增ID已经涨到了好几万。你执行DELETE FROM t再插入一条数据发现ID是10001而不是1。这时候别慌这不是数据库坏了只是DELETE没有重置计数器而已。如果你确实希望清空数据后从1开始最直接的办法就是改用TRUNCATE。但TRUNCATE不是万能钥匙它有两个限制你得知道一是TRUNCATE无法在事务里做到可回滚语义下的部分回滚绝大多数情况下你执行完TRUNCATE就再也找不回数据了二是TRUNCATE会重置自增计数器如果你的表有外键被别的表引用TRUNCATE会直接被拒绝执行。3.2 TRUNCATE后ID重新从1开始导致历史引用数据错乱TRUNCATE重置ID在某些场景下反而是一种隐患。设想一张“订单明细表”其中主键ID被“物流记录表”以普通索引字段的方式引用。你清理上半年数据时执行了TRUNCATE下半年重新导入数据新订单的ID又变成了1、2、3而物流记录表里还残留着上半年数据的关联标记这些标记对应的ID在新订单里被重新复用结果就是物流信息全部串了线。解决这种事儿的思路有两种。如果能够彻底清理所有关联表那TRUNCATE没问题如果只想清理主表而保留其他历史数据就绝不能TRUNCATE主表应该改用DELETE并手动把自增计数器调整到一个安全值以上。这个安全值的计算要特别注意要基于当前以及历史引用到此表ID的所有表中的最大值来估算而不是只看主表的当前最大值。简单说TRUNCATE是“物理重建”DELETE是“逻辑删除”。TRUNCATE后自增重置是“特性”DELETE后自增不重置也是“特性”关键看你业务上接不接受这两个特性带来的后果。3.3 手工指定ID插入导致计数器错位AUTO_INCREMENT的逻辑是“记录下一个分配值”这个值的推进不仅发生在隐式自增插入时也发生在显式指定ID插入时。你手工插入了一条ID为5000的记录计数器会立刻跳到5001。之后如果你删掉了这条ID为5000的记录再执行普通插入新ID依然是5001而不是5000。这看起来没什么问题但如果你在一个老系统做过数据迁移手工插入了大量历史ID然后清空了表又不希望新数据的ID从“历史最大值1”开始就容易踩坑。典型的场景一张配置表原来的数据ID在1000到2000之间你做了一次全量导出导入手工指定ID插回去了。之后业务方要求清空重来你执行了DELETE重新插入发现ID变成2001而产品预期是从1开始。这个问题的本质还是DELETE不清计数器只是手工指定ID把这个错位放大了。3.4 事务回滚后的自增ID空洞在一个事务里执行了三次插入然后回滚事务里的自增值已经消费掉了。即使插入本身被回滚自增计数器也不会回退。你会看到ID序列里出现空洞1、2、4、5中间缺了3。这种空洞是InnoDB的固有行为是并发插入性能的代价也是很多新手以为“存在删除操作”的误判来源。实际上判断是否存在删除操作不能只看ID是否连续。想确认记录是否被删除过建议从业务侧增加状态字段如is_deleted、status或者记录操作日志。指望用自增ID连续性来判断数据是否被删过在InnoDB里是永远不可靠的。3.5 跨版本迁移时自增值不一致从MySQL 5.7迁移到MySQL 8.0或者从MyISAM迁到InnoDB自增计数器初始化的方式不同也会带来一些隐蔽的问题。老版本里如果自增值是通过临时表导入的方式重建的可能没有把当前的计数器的最大值同步过来导致迁移完成后插入新数据时出现主键冲突。正确做法是迁移完成后立刻执行一条ALTER TABLE t AUTO_INCREMENT 安全值来校正避免踩坑。4. 主动校正自增值手动让ID回到期望的位置4.1 用ALTER TABLE直接修改Auto_increment值当你明确知道下一个ID应该从哪里开始时可以用以下命令直接把计数器的值改掉ALTER TABLE t AUTO_INCREMENT 1000;这个命令适用于InnoDB引擎修改后的值在MySQL 8.0里会持久化保存。要注意的是设置的AUTO_INCREMENT值必须大于当前表中的最大ID否则MySQL会自动将计数器重置为最大ID加1。也就是说你没办法用这个命令把自增值往小里调到位比如最大ID已经是999你设置成100这种是根本不会生效的。这个限制是出于数据安全的考虑如果把计数器调小到已有数据的范围之内下一次插入就可能发生主键冲突直接报错。如果你确实需要把ID回退到比当前最大ID小那就必须对表做类似重建的操作比如导出数据、TRUNCATE表、修改表定义、再导回数据或者使用临时表搬数据的方案。4.2 查询当前自增计数器值的几种方式想知道当前表的下一个自增值是多少常见有三种方法。第一种是用SHOW CREATE TABLE t返回里会直接在AUTO_INCREMENT后面标明当前值。第二种是SHOW TABLE STATUS LIKE t在Auto_increment列里能看到。第三种是查信息模式SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA your_db AND TABLE_NAME t;这三条途径结果理论上是一致的但有个前提查询时不能有并发写入否则读到的值可能是查询瞬间之后已经被消费过的值。一般联调环境无所谓生产环境你要是想精确拿到“没被并发写跳过”的值建议在低峰期用SELECT MAX(id)1 FROM t配合事务隔离级别来做判断。4.3 为什么不建议频繁手动重置计数器手动ALTER TABLE修改AUTO_INCREMENT本质上是在跟InnoDB的计数器管理机制打交道。频繁这么做有几个坏处第一每次ALTER TABLE都可能触发一次表元数据的锁操作在表数据量大的时候会阻塞读写第二手工重置计数器绕过了“由系统保证全局唯一”的分配逻辑一旦算错安全值就可能引发主键冲突导致插入失败第三如果这是一个长期被外部系统引用的主键你把计数器往回拨等于给未来的数据关联埋下了隐患。我的建议是只在两种情况下手动重置一种是大规模数据清理之后确认所有关联系统都不再依赖旧ID的引用另一种是初始化开发环境、测试环境时为了让测试数据干净一点。生产环境的自增ID原则上少动为妙。5. 选型建议与最佳实践到底用DELETE还是TRUNCATE5.1 什么场景选DELETE什么场景选TRUNCATE清理一张小表且后续希望ID保持继续增长选DELETE。典型场景是流水型业务表比如操作日志、审计日志这些表本身只做追加偶尔清理历史但ID不能回退否则对账和排障就会出问题。清空一张表且希望ID从头开始选TRUNCATE。典型场景是临时表、结果表、批次跑批的中间表。这类表每次跑批都是全新的数据ID从1开始反而方便核对。还有一种场景要特别注意大表的全量清理。如果你面对的是几千万行的大表DELETE会逐行写日志、逐行加锁批量删除要分多次执行否则会产生长事务拖垮主从同步。TRUNCATE在大表上的优势非常明显快、准、狠。但前提是你接受它的两个代价不可回滚、自增重置。生产环境如果对这两点没意见TRUNCATE就是最优解。5.2 生产环境自增ID管理的一套稳妥思路用自增ID做主键本身没有问题但要有几个防守性的习惯。第一在关键业务表里保留独立的业务编号字段。自增ID是数据库内部用来保证物理唯一性的东西对外展示和跨系统关联时优先用业务编号比如订单号、流水号。这样就算某天DDL失误导致自增ID重置对外业务也不受影响。第二清理数据时先查清关联关系再动手。用DELETE清主表时务必要检查哪些子表通过ID关联主表用TRUNCATE清主表时更要搞清楚子表是不是已经全部前置清理干净。第三给自己的清理操作写一份固定的执行模板。比如统一写成先备份、再执行DELETE、最后用信息模式校验Auto_increment值是否符合预期。这一套固定下来之后因为忘记调自增值导致的低级故障就基本能避免了。5.3 自增ID接近最大值时的兜底方案AUTO_INCREMENT在MySQL里的上限取决于整型范围。INT最大到21亿多BIGINT可以到9×10的18次方左右。普通业务选INT通常需要认真评估如果某些表每天的插入量在几十万级别INT恐怕撑不了太久建议一开始就选BIGINT。这一点上吃过亏的人不少一张表用INT做主键跑了三年多结果ID飙到19亿眼看就满了做迁移时真是折腾掉半条命。如果已经出现了自增ID即将用尽的预警常见方案有三种。第一种是改表结构把INT改成BIGINT这个操作在MySQL 8.0里可以借助在线DDL执行但大表依然会花很长时间。第二种是业务侧做分表把新数据分流到新表里新表可以单独设置起始ID。第三种是极端情况下利用AUTO_INCREMENT-1之类的技巧让MySQL配合业务从负值重新分配但这种方式不推荐毕竟侵入性太强而且对索引性能不友好。6. 常见问题排查速查表与个人踩坑心得6.1 现象、原因与解法对照速查现象可能原因解法DELETE所有行后再插入ID不归1DELETE不清自增计数器改用TRUNCATE或手动ALTER TABLE设置TRUNCATE后ID从1开始TRUNCATE重建表结构并重置计数器从业务上评估ID复用是否可接受ID序列出现空洞1、2、4、5事务回滚或插入失败已消费自增值无需处理属正常现象重启后自增值出现变化MySQL 8.0之前从表中重新推算最大ID升级到8.0或在低峰期手动校正手工导入数据后新插入ID冲突手工插入没有推进计数器或推进不到位导入完成后用ALTER TABLE校准表里没数据但Auto_increment很大多次插入后DELETE清空计数器未回落根据业务需要决定是否TRUNCATE6.2 我实际踩过的三个坑第一个坑是某次联调环境清理数据时用了DELETE当时没太在意计数器的问题。之后测试脚本反复造数据ID一路涨到几十万测试同学拿着接口返回的ID截图来问我“是不是数据库出故障了”场面一度十分尴尬。后来我就在测试环境统一改用TRUNCATE清表只有个别需要保留ID连续性的表才用DELETE。第二个坑是生产环境清理一张“订单历史表”时我判断所有关联子表都已经清理完毕于是执行了TRUNCATE。结果第二天业务反馈另一张未纳入清理清单的“补发记录表”里还残留着大量旧ID那些ID在新订单里被重新分配后补发记录全部串单。那之后我给自己定了一条规矩TRUNCATE大表之前必须先把所有可能引用到这张表的“隐藏关联”排查出来宁多勿漏。第三个坑是MySQL 5.7升级8.0之后我记得有一张表在旧版本里自增值是1000左右升级完直接插入新数据居然出现主键冲突。排查后才知道旧实例里计数器存在内存中最后一次重启后没有正确恢复到最新值导致导入数据时差距积累。后来我做了全量巡检用SHOW TABLE STATUS结合业务峰值估算把所有核心表都校正了一遍。6.3 最后再分享一个小技巧如果你想安全地实现“清空表数据但不重置自增且新ID不触发任何冲突”可以在DELETE之后执行一条轻量级的ANALYZE TABLE用来刷新表的统计信息和一些内部状态然后根据业务需求决定是否需要调整计数器。如果你希望清空数据后立刻把计数器落在一个确定的较大值上尤其是为了给将来可能的回迁数据预留空间可以在TRUNCATE之后执行如下语句把起点设在预留位置TRUNCATE TABLE t; ALTER TABLE t AUTO_INCREMENT 100000;这个组合很适合那些需要周期性清空、但又要给跨系统并行写入留出ID余量的中间表。总之DELETE和TRUNCATE没有孰优孰劣核心是搞清楚自己业务的ID连续性要求是什么再选择匹配的方案。我在处理这类问题时的一项经验是任何涉及清表或大范围删除的操作先在独立的环境跑一遍查看清理后表的Auto_increment值是否与预期一致再决定是否上生产。这套流程虽然多花几分钟但能挡掉绝大多数由自增序列引发的低级故障。

相关新闻

Burp Suite实战:自动化漏洞测试的理论模型与边界

Burp Suite实战:自动化漏洞测试的理论模型与边界

做安全测试的人应该都有这个体会:手工测漏洞到了后期,最消耗精力的根本不是"怎么测"这件事,而是那些重复到让人麻木的机械动作。同一个参数换几种编码、同一个输入点试不同的载荷、同一个功能模块反复点,做上两个小时后…

2026/10/19 6:58:04 阅读更多 →
OpenClaw敏感领域对话的免责声明与风险控制实践指南

OpenClaw敏感领域对话的免责声明与风险控制实践指南

把 AI 对话系统放进法律、医疗这类专业场景,很多开发者第一反应是“终于能靠专业咨询变现了”,但我的第一反应是“出事的概率有多大”。OpenClaw 这类通用对话框架接进垂直领域,能力越强,责任边界就越模糊。你回答了一个医疗问题&…

2026/10/19 6:57:03 阅读更多 →
Trae CN免费AI编码助手完整评测:从安装到实战的使用指南

Trae CN免费AI编码助手完整评测:从安装到实战的使用指南

我在过去几个月里,陆续把手上的AI编程插件拆了个遍,最后留下的主力编辑器是Trae CN这款AI编码助手。原因并不复杂:在AI编程工具集体转向订阅付费的当下,它直接用“免费”作为切入点,内置了多个主流大模型,安…

2026/10/19 6:57:03 阅读更多 →

最新新闻

diagram-design:从设计令牌到语义化图表的系统化设计方法

diagram-design:从设计令牌到语义化图表的系统化设计方法

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次听到 “diagram-design” 这个词,很多人会以为它只是“画图工具”的另一个说法。但真正在项目里被图表折磨过的人知道,问题从来不是“画不出来”,而是“画得乱、…

2026/10/19 7:37:20 阅读更多 →
编程Agent性能暴涨61%:MoE与强化学习的技术解析

编程Agent性能暴涨61%:MoE与强化学习的技术解析

说实话,我第一眼看到"编程 Agent 性能暴涨 61%"这个数字时,第一反应是"又来了一个刷榜的"。但把相关技术细节翻完之后,我承认这次不是营销包装,而是确确实实把编程 Agent 的能力天花板往上顶了一截。某 AI 代…

2026/10/19 7:37:20 阅读更多 →
Transformer长期预测失效原因与三重修复机制

Transformer长期预测失效原因与三重修复机制

简介:本资源是一份基于PyTorch实现的Transformer模型长期时间序列预测完整代码包,面向深度学习初学者与时间序列建模实践者,聚焦解决电力、气象等场景下的多步长未来趋势预测问题。压缩包共39个文件,含13个核心Python源码&#xf…

2026/10/19 7:37:20 阅读更多 →
Transformer长期时序预测实战:ETTh1上5天负荷温度预测

Transformer长期时序预测实战:ETTh1上5天负荷温度预测

简介:本资源是一套基于PyTorch实现的Transformer模型长期时间序列预测完整代码工程,面向深度学习初学者与时间序列分析实践者,聚焦解决传统RNN在长程依赖建模中的梯度衰减与并行性不足问题。项目复现了Transformer核心结构(含多头…

2026/10/19 7:37:20 阅读更多 →
Token、字符、字节到底有啥区别?大模型上下文窗口与API计费全靠它

Token、字符、字节到底有啥区别?大模型上下文窗口与API计费全靠它

最近有朋友问我一个问题:AI 大模型到底是按什么单位来“读”文字的?为什么同样一段中文,有人说消耗了 8000 token,有人算出来只有 4000,还有人直接按字节数去估费用,结果被账单吓了一跳。说实话&#xff0c…

2026/10/19 7:37:20 阅读更多 →
智能教育提示工程:从教学目标到可控制提示词系统的实战指南

智能教育提示工程:从教学目标到可控制提示词系统的实战指南

做教育方向的提示工程,和我做过的其他场景完全是两码事。如果你把通用场景里"给模型下指令、拿结果"那套思路原封不动搬到课堂里,大概率会被一线老师当场吐槽到怀疑人生。今天我想系统聊聊,作为提示工程架构师,在智能教…

2026/10/19 7:36:20 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →