任务六 删除数据
知识点
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的主要区别:
| 比较项 | DELETE | TRUNCATE |
|---|---|---|
| 删除方式 | 逐行删除,记录事务日志 | 直接删除所有数据页,不逐行记录日志 |
| 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删除的数据难以恢复