MySQL 删除数据操作使用 DELETE FROM
语句,它属于 DML(数据操作语言)范畴,DELETE 语句是一行一行地进行删除操作,同时它会将每行的操作记录到事务日志中,以便可以进行回滚操作,即表示 DELETE 语句操作是可以回滚的,这有别于 TRUNCATE
语句。
DELETE FROM
MySQL DELETE 语句主要两种形式,一个是单表删除数据,另一个是多表删除数据。
语法
单表删除数据语句:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
主要的可选项:
WHERE
- WHERE 子句指定要删除的行,如果未指定,则删除所有的行,即所有的数据,后面的
where_condition
是一个表达式,返回 true 的每行即表示要删除的行。 ORDER BY
- 如果指定了该子句,表示按照指定的顺序进行一行一行地删除。
LIMIT
- 该子句限制可以删除的行数,它只适用于单表删除,但不适用于多表删除。此外,LIMIT 子句的还有一层最大意义是,如果删除的行数过多,会带来性能的损耗,这是可以通过该子句可以有效地控制删除的速度。
多表删除语句:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*]] ...
FROM table_references
[WHERE where_condition]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name[.*] [, tbl_name[.*]] ...
USING table_references
[WHERE where_condition
修饰符
DELETE 语句支持修饰符主要如下:
LOW_PRIORITY
- 如果指定 LOW_PRIORITY 修饰符,表示服务端直到没有其他客户端读取该表时,才执行删除操作,即它是延迟操作;它只作用于表级锁的存储引擎(如 MyISAM、MEMORY、MERGE)。
QUICK
- 对于 MyISAM 存储引擎,如果使用 QUICK 修饰符,则存储引擎在删除期间不会合并索引的叶子节点,这可能会加快某些类型的删除操作。
IGNORE
- IGNORE 修饰符表示在删除期间若出现错误,它会进行忽略(如在解析阶段遇到的错误),会作为警告信息返回。
示例
删除表中所有的数据
这是最常用的操作情况,示例如下:
mysql> DELETE FROM knowledgedict_tbl;
删除 knowledgedict_tbl 表的所有数据。
删除符合条件的多行记录
假设表中存在 status
字段,将 status = -1
的记录都删除,示例如下:
mysql> DELETE FROM knowledgedict_tbl WHERE status = -1;
删除顺序的记录
如果 DELETE 语句包含 ORDER BY 子句,则按子句指定的排序删除行。其主要与 LIMIT 一起使用。例如,以下语句查找与 WHERE 子句匹配的行,并按 create_time 字段升序排序,并删除第一个(最旧的)行:
mysql> DELETE FROM knowledgedict_tbl WHERE status = -1 ORDER BY create_time LIMIT 1;