尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
如何用SQL删除表中除最新一条以外的所有记录?
用 ROW_NUMBER() 窗口函数标记并删除旧记录直接DELETE时无法“保留最新一条”必须借助排序和行号来识别哪些该删。核心思路是按时间字段如created_at或id降序排给每行打上序号只保留ROW_NUMBER() 1的那条其余全删。常见错误是写成DELETE FROM table WHERE id NOT IN (SELECT MAX(id) FROM table)—— 这在有重复时间、或id不连续/非主键时会漏删或多删更糟的是若表为空或只有 1 行MAX(id)返回NULL导致整张表被误删。务必确保排序依据字段能唯一确定“最新”——优先用带时区的created_at其次才是id前提是自增且不跳号PostgreSQL / SQL Server / Oracle / MySQL 8.0 都支持ROW_NUMBER()但语法细节不同MySQL 要求子查询套一层SQL Server 可直接在DELETE中用 CTE执行前先用SELECT验证要删的行SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn FROM logs;确认rn 1的确实是预期旧数据MySQL 8.0 实际可执行的删除语句MySQL 不允许在子查询中直接引用被删表所以必须用 CTE 或派生表绕过限制。以下写法经实测可用假设按user_id分组保留每组最新一条WITH ranked AS (SELECT id, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rnFROM logs)DELETEl FROM logs lINNER JOIN ranked r ON l.id r.idWHERE r.rn 1;注意PARTITION BY是可选的——如果目标是全表只留最新一条不分组就把PARTITION BY user_id去掉改成ORDER BY created_at DESC即可。别漏写INNER JOIN否则 MySQL 会报错You cant specify target table for update in FROM clause若用id排序确保它代表插入顺序用created_at更安全但要注意 NULL 值——加WHERE created_at IS NOT NULL过滤大表慎用该操作会锁表或产生大量 binlog建议在低峰期执行并提前备份SQLite 中没有 ROW_NUMBER() 怎么办SQLite 3.25.0 支持窗口函数但旧版本比如 macOS 自带的 3.19不支持。这时得用自关联 子查询模拟DELETEFROM logsWHERE id NOT IN (SELECT MIN(id) FROM logs l2WHERE l2.user_id logs.user_idGROUP BY user_id);这个写法靠GROUP BY MIN(id)找出每组“最小 id”即最早插入的然后删掉所有不在这个集合里的行——但它保留的是“最早一条”不是“最新一条”。要保留最新得把MIN(id)换成MAX(id)前提是id严格递增且能代表时间顺序。如果时间字段是created_at且 SQLite 版本够新优先用ROW_NUMBER() OVER (ORDER BY created_at DESC)如果版本太老又必须按时间删只能先导出最新行到临时表清空原表再导入——没有优雅的单语句解注意NOT IN遇到子查询返回NULL时整个条件为UNKNOWN导致零行被删加AND id IS NOT NULL防御WHERE 条件里的时间字段有 NULL 值怎么办ORDER BY created_at DESC会让 NULL 排在最前面MySQL 默认行为结果可能是删掉了非 NULL 的新记录留下 NULL 的“脏数据”。这不是 bug是 SQL 标准定义。显式控制 NULL 位置ORDER BY created_at DESC NULLS LASTPostgreSQL / Oracle 支持MySQL 和 SQLite 用ORDER BY created_at DESC, id DESC辅助排序更稳妥的做法是过滤掉 NULLWHERE created_at IS NOT NULL加在子查询或 CTE 中避免干扰排序逻辑如果业务允许建表时就给时间字段加NOT NULL DEFAULT CURRENT_TIMESTAMP从源头杜绝这个问题实际执行时分组维度、时间字段是否可靠、数据库版本、NULL 处理这四点卡住大多数人。没跑通之前先用SELECT把rn 1的行查出来看一眼比反复试删安全得多。
RELATED

相关推荐

结构体思维:从零散变量到数据聚合,提升代码可维护性

结构体思维:从零散变量到数据聚合,提升代码可维护性

1. 从一个“简单”的需求说起 最近在做一个后台管理系统的用户模块,产品经理提了个需求:要在用户列表页展示用户的头像、昵称、ID、注册时间,并且点击某个用户能跳转到详情页。这听起来再简单不过了,对吧?我一开始也是…

📅 2026/10/6 15:18:22
Java全栈面试进阶宝典:从基础到架构的23个核心模块

Java全栈面试进阶宝典:从基础到架构的23个核心模块

1. 项目概述:Java全栈面试进阶宝典的核心价值 最近三年Java全栈岗位的面试难度呈现指数级上升,从早期的SSM框架八股文到现在需要完整掌握云原生、性能优化和系统设计能力。我在担任某大厂面试官的两年期间,累计评估过300候选人,发…

📅 2026/9/28 13:09:29
智能体的“记忆”难题

智能体的“记忆”难题

智能体的“记忆”难题 1 | 一个被忽视的关键问题 2 | 人类的记忆 vs. AI的记忆 3 | 当前解决方案及其局限 4 | 理想中的AI记忆系统 5 | 这意味着什么?#推理式AI崛起#思维链与慢思考

📅 2026/9/30 8:52:45
MORE NEWS

更多资讯

📰

柳州电工证去哪里年审千万别踩坑 电工证过期了怎么处理

柳州电工证去哪里年审千万别踩坑 电工证过期了怎么处理 证书过期了不知道怎么复审延期,真的会直接影响你的工作和收入。尤其在柳州这样的工业城市,电工证是很多从业者必备的“通行证”,一旦过期,轻则无法上岗,重则可能面临法律责任。很多人在电工证年审…

📰

宜城特种作业操作证全国通用怎么转?一个焦作电工的真实经历

宜城特种作业操作证全国通用怎么转?一个焦作电工的真实经历 之前考的证在外省能不能转过来?这个问题几乎每个特种作业操作证持证人都问过。尤其是像我在焦作市从事市政公用工程的电工,早年在外地考的证,现在回到本地,想继续从事相关工作,就必须搞清楚证…

📰

宜城特种作业操作证电子证书过期了怎么处理

宜城特种作业操作证电子证书过期了怎么处理 证书过期了不知道怎么复审延期,现在拿着的电子证书还能用吗?其实很多在宜城从事特种作业的工友都有这样的困扰,尤其是像你这种在驻马店房建工程领域工作的朋友,特种作业操作证是必须持证上岗的,一旦过期,不仅…

📰

电工作业触电惊悸报名费多少钱 2026河南最新政策解读

电工作业触电惊悸报名费多少钱 2026河南最新政策解读 你是不是也担心学历不高,连电工作业触电惊悸的报名资格都拿不到?别急,河南2026年的最新政策早有安排,学历门槛并没有想象中那么高。只要你有相关工作经验或者参加过培训,就有可能顺利报考。…

📰

周宁低压电工证报名怕被坑?费用和流程全在这了

周宁低压电工证报名怕被坑?费用和流程全在这了 你是不是也这样,听说要考低压电工证,却不知道去哪里报名,怕被中介骗钱?网上一搜“周宁低压电工证多少钱”,信息乱七八糟,真假难辨,还容易被忽悠?别急,这篇文就帮你理清流程,避开坑,还告诉你周宁低压…

📰

蚌埠电工证怎么拿保姆级教程:外省证能转吗?看看真实避坑指南

蚌埠电工证怎么拿保姆级教程:外省证能转吗?看看真实避坑指南 之前考的证在外省能不能转过来?这个问题其实很多人都问过,尤其是那些在外地工作、后来回到蚌埠的朋友,他们最担心的就是外省的电工证是否能在本地“落地”。今天这篇【蚌埠电工证怎么拿保姆级…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬