跳到主要内容

任务六 删除数据

知识点​

1. DELETE语句的基本语法格式是什么?​

答:DELETE语句的基本语法格式:

DELETE FROM 表名
[WHERE 条件表达式];

DELETE语句从指定表中删除满足WHERE条件的记录。如果不使用WHERE子句,则删除表中的所有记录。

2. DELETE语句中WHERE子句的作用是什么?​

答:WHERE子句用于限定删除范围,只有满足条件的记录才会被删除。如果不加WHERE子句,DELETE会删除表中所有记录,这是非常危险的操作。

例如:DELETE FROM student WHERE sno = '2023001'; 只删除学号为2023001的学生记录。 而 DELETE FROM student; 会删除student表中的所有记录。

3. 如何使用子查询作为DELETE的删除条件?​

答:可以在WHERE子句中使用子查询来限定删除范围。例如:

-- 删除没有选课记录的学生
DELETE FROM student
WHERE sno NOT IN (SELECT sno FROM sc);

4. DELETE语句可以删除指定字段的数据吗?​

答:不可以。DELETE语句是以行为单位删除整条记录,不能只删除某个字段的数据。如果只需要清除某个字段的值,应使用UPDATE语句将该字段设为NULL:UPDATE 表名 SET 字段名 = NULL WHERE 条件;

5. TRUNCATE TABLE语句的语法格式和作用是什么?​

答:TRUNCATE TABLE语句用于快速清空表中的所有数据,语法格式:

TRUNCATE [TABLE] 表名;

TRUNCATE会删除表中的所有记录,但保留表结构(字段定义、索引等)。TABLE关键字可以省略。

6. DELETE和TRUNCATE有哪些区别?​

答:DELETE和TRUNCATE的主要区别:

比较项DELETETRUNCATE
删除方式逐行删除,记录事务日志直接删除所有数据页,不逐行记录日志
WHERE条件支持WHERE条件删除部分记录不支持WHERE,只能删除全部记录
自增字段不重置AUTO_INCREMENT计数器重置AUTO_INCREMENT为初始值
事务是DML语句,可回滚是DDL语句,不可回滚
执行速度较慢(逐行删除+记录日志)很快(直接释放数据页)
触发器触发DELETE触发器不触发触发器
返回值返回删除的行数返回0

7. 删除数据时如何处理外键约束?​

答:当表中存在外键关联时,删除数据可能会受到外键约束的限制:

  • 如果要从父表中删除记录,但子表中有引用该记录的外键,则删除会失败(除非外键约束设置了ON DELETE CASCADE)
  • 建议先删除子表中的相关记录,再删除父表中的记录
  • 可以在外键定义时指定 ON DELETE CASCADE(级联删除)或 ON DELETE SET NULL(设为NULL)

8. DELETE语句可以使用LIMIT限制删除行数吗?​

答:可以。使用LIMIT子句限制删除的行数,通常配合ORDER BY使用以确定删除哪些行。例如:DELETE FROM student ORDER BY sno LIMIT 10; 删除按学号排序的前10条记录。这在批量删除大量数据时可以分批进行,避免锁表时间过长。

9. 删除数据后AUTO_INCREMENT计数器如何变化?​

答:

  • DELETE:删除记录后,AUTO_INCREMENT计数器不会重置,新插入的记录仍使用递增后的值。例如表中有1~100的记录,DELETE全部后,新插入的记录从101开始
  • TRUNCATE:清空表后,AUTO_INCREMENT计数器会重置为初始值(通常是1),新插入的记录从1开始

10. 删除数据时需要注意什么?​

答:

  • 务必使用WHERE子句:不加WHERE会删除全部记录
  • 先查询再删除:先用SELECT验证WHERE条件筛选的记录范围
  • 备份重要数据:删除前先备份表数据
  • 事务保护:在事务中执行DELETE,确认无误后再COMMIT
  • 外键约束:注意外键约束可能导致删除失败
  • 不可恢复:如果没有事务保护,DELETE删除的数据难以恢复