在 MySQL 中删除一条或多条记录,主要使用 DELETE 语句。这是一个非常强大但也极其危险的操作,因为一旦删除,数据通常很难恢复。
DELETE FROM table_name
WHERE condition;
-
DELETE FROM table_name: 指定要从哪个表中删除数据。
-
WHERE condition: 这是最关键的部分,它定义了要删除哪些行。如果省略 WHERE 子句,将会删除表中的所有记录!
假设我们有一个 students 表,数据如下:
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | Alice | 20 |
| 2 | Bob | 22 |
| 3 | Charlie | 21 |
| 4 | David | 20 |
+----+----------+-----+
删除 id 为 3 的学生记录。id 通常是主键,具有唯一性,所以这个操作只会删除一行。
DELETE FROM students
WHERE id = 3;
执行后,students 表的数据将变为:
+----+--------+-----+
| id | name | age |
+----+--------+-----+
| 1 | Alice | 20 |
| 2 | Bob | 22 |
| 4 | David | 20 |
+----+--------+-----+
删除所有年龄为 20 的学生。这个条件可能会匹配多行。
DELETE FROM students
WHERE age = 20;
执行后,students 表的数据将变为:
+----+------+-----+
| id | name | age |
+----+------+-----+
| 2 | Bob | 22 |
+----+------+-----+
DELETE 操作是不可逆的。为了避免误删数据,请务必遵循以下安全准则:
在执行 DELETE 之前,将 DELETE 换成 SELECT *,看看它会选中哪些行。这就是你将要删除的行。
错误做法:直接执行 DELETE FROM students WHERE age = 20;
正确做法:
-
先查询:
SELECT * FROM students WHERE age = 20;
确认查询结果是你想要删除的数据。
-
再删除:
DELETE FROM students WHERE age = 20;
将 DELETE 操作包裹在事务中。如果删除后发现有误,可以立即回滚(ROLLBACK)事务,撤销删除操作。如果确认无误,再提交(COMMIT)事务。
START TRANSACTION;
DELETE FROM students WHERE age = 20;
COMMIT;
如果你想删除表中的所有记录,除了 DELETE,还有一个更高效的选择:TRUNCATE。
总结:
-
删除部分数据,使用
DELETE ... WHERE ...。
-
删除全部数据且不关心回滚,并希望重置自增 ID,使用
TRUNCATE TABLE。
-
使用
DELETE FROM table_name WHERE condition; 来删除数据。
-
WHERE 子句至关重要,务必小心使用。
-
安全第一:在执行
DELETE 前,先用 SELECT 检查 WHERE 条件,或者使用事务来包裹 DELETE 操作以便回滚。
-
删除全表数据时,考虑使用更高效的
TRUNCATE TABLE。