题解 | 删除记录(一)

删除记录(一)

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=1score<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(清空表),避免混淆使用:

操作对象

逐条删除表中的记录

直接删除表结构后重建(不逐条删记录)

事务支持

支持事务,删除后可通过ROLLBACK回滚

不支持事务,执行后无法回滚(部分数据库)

执行效率

数据量越大,效率越低(逐条操作)

效率高,与数据量无关

自增字段(AUTO_INCREMENT)

保留自增字段的当前值(如自增到 10,删除后新增仍从 11 开始)

重置自增字段为初始值(如从 1 开始)

适用场景

需删除部分记录(有条件筛选)

需彻底清空表,且无需回滚

四、关键注意事项(避坑指南)

  1. 必须验证筛选条件:执行前先用 SELECT 确认要删除的记录,避免条件错误。示例:删除前先检查 WHERE uid=1001 的记录是否正确sql
  2. 禁止无 WHERE 条件的 DELETE:除非明确要清空表,否则必须加 WHERE 条件。若需清空,优先考虑 TRUNCATE(效率更高)。
  3. 使用事务保护:在支持事务的数据库(如 MySQL InnoDB、PostgreSQL)中,先开启事务再执行删除,确认无误后提交。sql
  4. 避免删除大表数据:若需删除大表中 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;
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务