题解 | 删除记录(一)
删除记录(一)
https://www.nowcoder.com/practice/d331359c5ca04a3b87f06b97da42159c
delete from exam_record where timestampdiff(minute, start_time, submit_time) < 5 and score < 60
DELETE 是 SQL 中用于删除表中特定记录的核心语句,需严格控制删除范围以避免数据误删。以下是其用法、分类及关键注意事项的总结:
一、基本语法
sql
DELETE FROM 表名 [WHERE 筛选条件]; -- 可选,但无此条件会删除表中所有记录
FROM 表名:指定要删除记录的目标表,不可省略。WHERE 筛选条件:通过条件(如id=1、score<60)限定删除的记录,是控制删除范围的核心,建议每次使用都加上。
二、常见使用场景及示例
假设存在表 exam_record(考试记录表),包含字段 uid(用户 ID)、exam_id(考试 ID)、score(分数),以下为典型场景示例:
1. 删除单条记录(精准删除)
通过唯一标识(如 uid+exam_id)删除某一条特定记录,避免误删其他数据。示例:删除用户 uid=1001 参加的 exam_id=9001 的考试记录
sql
DELETE FROM exam_record WHERE uid = 1001 AND exam_id = 9001;
2. 删除符合条件的多条记录
通过范围条件(如数值范围、时间范围)删除批量记录。示例:删除所有分数低于 60 分的考试记录
sql
DELETE FROM exam_record WHERE score < 60;
3. 删除所有记录(谨慎使用)
不添加 WHERE 条件时,会删除表中所有记录,但保留表结构(与 TRUNCATE 不同)。示例:清空 exam_record 表的所有记录
sql
DELETE FROM exam_record; -- 无WHERE条件,需反复确认
三、DELETE 与 TRUNCATE 的核心区别
实际操作中,常需区分 DELETE(删除记录)和 TRUNCATE(清空表),避免混淆使用:
操作对象 | 逐条删除表中的记录 | 直接删除表结构后重建(不逐条删记录) |
事务支持 | 支持事务,删除后可通过 | 不支持事务,执行后无法回滚(部分数据库) |
执行效率 | 数据量越大,效率越低(逐条操作) | 效率高,与数据量无关 |
自增字段(AUTO_INCREMENT) | 保留自增字段的当前值(如自增到 10,删除后新增仍从 11 开始) | 重置自增字段为初始值(如从 1 开始) |
适用场景 | 需删除部分记录(有条件筛选) | 需彻底清空表,且无需回滚 |
四、关键注意事项(避坑指南)
- 必须验证筛选条件:执行前先用
SELECT确认要删除的记录,避免条件错误。示例:删除前先检查WHERE uid=1001的记录是否正确sql - 禁止无 WHERE 条件的 DELETE:除非明确要清空表,否则必须加
WHERE条件。若需清空,优先考虑TRUNCATE(效率更高)。 - 使用事务保护:在支持事务的数据库(如 MySQL InnoDB、PostgreSQL)中,先开启事务再执行删除,确认无误后提交。sql
- 避免删除大表数据:若需删除大表中 80% 以上的数据,直接
DELETE可能导致锁表、日志暴涨,建议分批次删除(如按id分段)或用TRUNCATE+ 重新插入保留数据的方式。
五、特殊用法:关联表删除(多表删除)
部分数据库(如 MySQL)支持通过 DELETE 同时删除多个关联表的记录,需指定关联条件。示例:删除 exam_record 中 uid=1001 的记录,同时删除 user_info 中同 uid 的用户记录
sql
DELETE er, ui -- 指定要删除记录的表别名 FROM exam_record er JOIN user_info ui ON er.uid = ui.uid -- 关联条件 WHERE er.uid = 1001;