MySQL DELETE 查询:如何从表中删除一行

⚡ 智能摘要

MySQL DELETE 查询从表中删除不再需要的行,并返回受影响的行数。本资源解释了 DELETE 语法、WHERE 筛选、使用 IN 进行多行删除,以及更安全的替代方法 TRUNCATE 和 DROP。

  • 🗑️ 核心声明: DELETE FROM `table_name` [WHERE condition] 删除整行并返回已删除的行数。
  • ⚠️ 省略了“地点”: 省略 WHERE 子句会删除表中的每一行,因此在执行之前务必进行筛选。
  • 🎯 Target删除: WHERE `movie_id` = 18 删除一条记录,而 WHERE `movie_id` IN (20,21) 则在一条语句中删除多条记录。
  • 🔁 不可逆转的行动: 如果没有备份,删除的数据将无法恢复,因此在运行 DELETE 之前请备份数据库。
  • 📊 行级作用域: DELETE 只能删除整行;要清除单个列的值,需要使用 UPDATE 语句并传入 NULL。
  • DELETE、TRUNCATE 和 DROP: DELETE 会筛选行,TRUNCATE 会立即清空表,而 DROP 会删除表结构本身。

什么是 DELETE 查询?

MySQL 删除 DELETE 语句用于从数据库表中删除不再需要的行。它会从表中删除整行,并返回已删除行的计数。当您需要从数据库中清除临时数据或过时数据时,DELETE 语句非常有用。

DELETE 查询 MySQL 一次执行即可从表中删除多行。当需要从数据库表中删除大量行时,此功能非常有利。

一旦删除某行数据,就无法恢复。因此,在删除数据之前务必备份数据库,以便在需要时可以恢复和查看数据库。

如何删除一行 MySQL

既然语句的目的已经明确,下一步就是语法。要删除一行,请执行以下操作: MySQL,使用 DELETE FROM 语句:

DELETE FROM `table_name` [WHERE condition];

位置:

  • 从 `table_name` 中删除 讲述了 MySQL 服务器从指定表中删除行。
  • [WHERE 条件] 是可选的,用于应用过滤器,以限制 DELETE 查询影响的行数。

如果 WHERE 子句 不用于 MySQL 删除查询,然后 所有 指定表中的行将被删除。

⚠️警告: 首先以 SELECT 语句运行筛选器。如果它返回的正是您想要删除的行,则执行相应的 DELETE 语句是安全的。完整的语法文档请参见[此处]。 MySQL 删除语句手册.

示例 MySQL 删除查询

下一节将构建一个小型数据集,然后从中删除数据。

步骤 1:插入示例数据

在更详细地讨论 SQL DELETE 语句之前,让我们先向 movies 表中插入一些示例数据以供参考。

INSERT INTO `movies` (`title`, `director`, `year_released`, `category_id`) VALUES ('The Great Dictator', 'Charlie Chaplin', 1940, 7);
INSERT INTO `movies` (`title`, `director`, `category_id`) VALUES ('sample movie', 'Anonymous', 8);
INSERT INTO `movies` (`title`, `director`, `year_released`, `category_id`) VALUES ('movie 3', 'John Brown', 1920, 8);

执行上述脚本会将三 (3) 部电影添加到电影表中。在继续之前,让我们先列出表中的所有电影。

SELECT * FROM `movies`;

执行上述脚本后,我们将得到以下结果。新插入的三行数据已高亮显示。

电影 ID 标题 导向器 发行年份 类别编号
1 加勒比海盗4 罗伯·马歇尔 2011 1
2 忘掉莎拉·马歇尔 尼古拉斯·斯托勒 2008 2
3 X-战警 2008
4 Code 黑 埃德加·吉姆斯 2010
5 爸爸的小女孩 2007 8
6 天使与魔鬼 2007 6
7 达芬奇 Code 2007 6
9 Honey moonERS 约翰舒尔茨 2005 8
16 67% 有罪 2012
18 大独裁者 查理·卓别林 1940 7
19 样片 匿名 8
20 电影3 约翰·布朗 1920 8

步骤 2:删除单行

假设 Myflix 视频库不再出租电影《大独裁者》,并希望将其从数据库中删除。该电影的 ID 为 18,因此以下脚本会删除该行。

DELETE FROM `movies` WHERE `movie_id` = 18;

在以下位置执行上述脚本 MySQL 工作台 针对 Myflix 数据库,从表中删除 ID 为 18 的电影。

现在让我们来检查一下电影表的当前状态。

SELECT * FROM `movies`;
电影 ID 标题 导向器 发行年份 类别编号
1 加勒比海盗4 罗伯·马歇尔 2011 1
2 忘掉莎拉·马歇尔 尼古拉斯·斯托勒 2008 2
3 X-战警 2008
4 Code 黑 埃德加·吉姆斯 2010
5 爸爸的小女孩 2007 8
6 天使与魔鬼 2007 6
7 达芬奇 Code 2007 6
9 Honey moonERS 约翰舒尔茨 2005 8
16 67% 有罪 2012
19 样片 匿名 8
20 电影3 约翰·布朗 1920 8

注意:

  • 查询结果集中不再返回 ID 为 18 的电影。
  • 你不能使用 DELETE 语句从表中删除单个列。该语句会删除整行。要清除单个字段,请使用其他方法。 更新查询 这会将该列的值设置为 NULL。

步骤 3:删除包含 IN 的多行

假设我们有一个想要删除的电影列表。与其为每一行运行一条语句,我们可以将 WHERE 子句与 IN 运算符结合使用。

DELETE FROM `movies` WHERE `movie_id` IN (20,21);

执行上述脚本会一次性从我们的电影表中删除 ID 为 20 和 21 的电影。

DELETE、TRUNCATE 和 DROP 在 MySQL

DELETE 并不是从数据库中删除数据的唯一方法。 MySQL初学者常常会在更快捷的命令更合适的时候选择它,因此下表对这三个删除命令进行了比较。

特性 删除 截短 下降
命令类型 DML DDL DDL
WHERE 子句 支持 不支持 不支持
移除的内容 选定行 所有行 行和表格结构
回滚 交易内部可能发生 不可能(隐式提交) 不可能(隐式提交)
自动递增 计数器保留 计数器重置为初始值 柜台随桌子一起被移走了。
大型赌桌上的速度 慢速(逐行) 速度非常快 速度非常快

当您需要筛选或回滚操作时,请使用 DELETE 键。 TRUNCATE TABLE 当您需要快速清空表并重置其 AUTO_INCREMENT 计数器时,请使用 DROP 语句。仅当不再需要该表时才使用 DROP 语句,因为它会连同数据一起删除表定义。

常见问题

仅在未关闭的事务中。运行 START TRANSACTION,执行 DELETE 操作,然后执行 ROLLBACK 撤销操作。如果在 COMMIT 之后或启用了自动提交,则数据行将被删除,只能通过备份恢复。

使用多表 DELETE 语句 注册在 FROM 关键字之前分别命名两个表。或者,定义外键时使用 ON DELETE CASCADE 语句,这样当父行被删除时,子行也会自动删除。

安全更新模式默认启用。 MySQL 工作台它会拒绝任何 WHERE 子句未使用键列的 DELETE 语句,从而防止意外删除整表。您可以在“编辑”>“首选项”>“SQL 编辑器”中禁用此功能。

是的。AI 助手可以将简单的英语请求翻译成 DELETE 语句,并解释 WHERE 子句。但务必先对照 SELECT 语句检查生成的筛选条件,因为 AI 模型无法查看您的实时数据。

不。让 AI 生成语句,但要先在备份或暂存副本上亲自执行。缺少 WHERE 子句会删除所有行,一旦事务提交,任何 AI 工具都无法撤销。

总结一下这篇文章: