在 MySQL 中,删除数据是常见的操作,主要通过 DELETE 语句来实现。DELETE 语句用于从表中删除符合条件的记录。在一些情况下,还可能使用 TRUNCATE 来删除所有记录。以下是 MySQL 删除数据的常用方法汇总,以及具体的案例和笔记。
基础删除 (DELETE)
DELETE 语句用于删除表中的记录。如果没有指定条件,DELETE 会删除表中的所有记录。常见的语法如下:
语法
DELETE FROM table_name WHERE condition;
-
table_name:指定要删除记录的表名。 -
condition:指定删除条件,只有符合条件的记录会被删除。如果省略WHERE条件,所有记录都会被删除。
DELETE FROM userTable WHERE id = 1;
删除 id 为 1 的记录 ↑。
DELETE FROM userTable WHERE age > 30;
删除所有 age 大于 30 的记录 ↑。
2. 删除所有记录(不删除表结构)
如果希望删除表中所有记录,但保留表结构,可以使用 DELETE 语句,但不加 WHERE 条件。
DELETE FROM userTable;
该语句会删除 userTable 表中的所有记录,但保留表结构和表中的列 ↑。
注意:删除所有记录时会触发删除操作的触发器(如果存在),并且通常比 TRUNCATE 慢。
3. 删除某一条件下的多条记录
你可以使用 DELETE 语句来删除满足特定条件的多条记录。常用的条件有比较运算符、逻辑运算符、范围运算符等。
DELETE FROM userTable
WHERE age BETWEEN 20 AND 30;
删除 age 在 20 到 30 范围内的记录 ↑。
DELETE FROM userTable
WHERE gender = 'female' AND age < 25;
删除 gender 为 female 且 age 小于 25 的记录 ↑。
DELETE FROM userTable
WHERE phone LIKE '123%';
删除 phone 字段以 123 开头的记录 ↑。
4. 删除特定条数的记录
有时你可能希望删除特定条数的记录。可以结合 LIMIT 子句来限制删除的数量。
DELETE FROM userTable
WHERE age > 30
LIMIT 5;
删除 age 大于 30 的前 5 条记录 ↑。
注意:MySQL 的 DELETE 语句在某些情况下可以结合 LIMIT 使用来删除限制条数的记录。
5. 使用 JOIN 删除
有时你可能需要基于两个表的关联关系来删除记录。可以使用 JOIN 来进行删除操作。
DELETE u FROM userTable u
INNER JOIN userDetails d ON u.id = d.user_id
WHERE d.phone = '1234567890';
-
这条查询删除所有在
userDetails表中phone为'1234567890'的用户记录,同时也删除userTable中相关联的记录。 -
注意:
DELETE操作的语法允许通过JOIN删除多个表中的记录,但要确保语法正确。
6. 删除前检查 (SELECT)
在执行 DELETE 语句之前,最好先运行一个 SELECT 语句来查看将被删除的记录,以避免误删数据。
SELECT * FROM userTable
WHERE age > 30;
先查看所有 age 大于 30 的记录,再决定是否执行删除操作 ↑。
7. 删除表中的重复记录
如果你希望删除表中的重复记录,可以通过使用 DELETE 和 JOIN 来实现。为了删除重复的记录,通常需要有一个唯一标识符(如 id)。
假设 userTable 表中存在重复的记录,可以通过以下方式删除重复的记录:
DELETE u1 FROM userTable u1
INNER JOIN userTable u2
ON u1.id > u2.id AND u1.name = u2.name;
这条查询删除所有 name 相同且 id 较大的记录,保留较小的 id(也可以根据需要进行调整) ↑。
8. 删除外键约束下的记录
在删除数据时,若表与其他表存在外键约束,删除操作可能受到限制。MySQL 提供了三种外键约束行为:
-
CASCADE:当父表记录删除时,子表记录也会被自动删除。
-
SET NULL:当父表记录删除时,子表对应字段会被设置为
NULL。 -
NO ACTION / RESTRICT:如果外键约束存在,无法删除相关记录。
DELETE FROM orders
WHERE user_id = 1;
如果 orders 表中的 user_id 与 users 表通过外键关联,并且外键约束设置为 CASCADE,则删除 users 表中的 id = 1 记录时,orders 表中所有 user_id = 1 的记录也会被删除 ↑。
9. TRUNCATE 删除所有记录
TRUNCATE 是另一种用于删除表中所有数据的方法,它与 DELETE 不同,TRUNCATE 删除所有记录且不会触发删除触发器。与 DELETE 的区别:
-
TRUNCATE比DELETE更高效,因为它不逐行删除数据,而是直接清空整个表。 -
TRUNCATE无法通过WHERE子句删除特定记录,它总是删除所有记录。
TRUNCATE TABLE userTable;
该语句会删除 userTable 表中的所有记录,并且会重置自增列的计数器 ↑。
注意:TRUNCATE 操作是不可恢复的,且无法在事务中回滚。
10. 删除带有 LIMIT 的记录
对于某些较大的表,可能需要分批删除记录。你可以结合 LIMIT 和 WHERE 子句,逐步删除记录。
DELETE FROM userTable
WHERE age > 30
LIMIT 100;
这将删除 age > 30 的前 100 条记录。你可以通过多次执行来删除更多的记录 ↑。
| 方法 | 说明 | 示例 |
|---|---|---|
| DELETE | 删除符合条件的记录 | DELETE FROM userTable WHERE id = 1; |
| 删除所有记录 | 删除表中的所有记录,但保留表结构 | DELETE FROM userTable; |
| 删除多条记录 | 删除符合特定条件的多条记录 | DELETE FROM userTable WHERE age > 30; |
使用 LIMIT 限制删除记录数 | 限制删除记录的数量 | DELETE FROM userTable WHERE age > 30 LIMIT 5; |
使用 JOIN 删除 | 基于多个表的关联来删除记录 | DELETE u FROM userTable u INNER JOIN userDetails d ON u.id = d.user_id WHERE d.phone = '1234567890'; |
| 删除前检查 | 使用 SELECT 查询来查看将要删除的记录 | SELECT * FROM userTable WHERE age > 30; |
| 删除重复记录 | 删除表中的重复记录 | DELETE u1 FROM userTable u1 INNER JOIN userTable u2 ON u1.id > u2.id AND u1.name = u2.name; |
| 外键约束下的删除 | 删除时会影响到与其他表有关的记录(如 CASCADE) | DELETE FROM orders WHERE user_id = 1; |
使用 TRUNCATE 删除所有记录 | 删除所有记录并重置自增列计数器 | TRUNCATE TABLE userTable; |
| 分批删除记录 | 使用 LIMIT 分批删除大量数据 | DELETE FROM userTable WHERE age > 30 LIMIT 100; |