MySQL 6年前

MySQL之删除数据

作者头像 刘宇帅
2751 1

单表删除语法

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
    [PARTITION (partition_name [, partition_name] ...)]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

多表删除

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]

使用修饰符LOW_PRIORITY时 SQL 执行优先级会很低直到所有查询语句执行完毕才执行。LOW_PRIORITY 只对只支持表锁的引擎有用,例如 MyISAM、MEMORY、MERGE。
使用修饰符QUICK 时,存储引擎不会去处理因删除数据而需要合并索引叶子节点,这样可以在一定程度上加快删除速度,例如 MyISAM。
修饰符IGNORE 用来忽略 SQL 执行过程中的错误报错。
另外 delete 语句支持 order bylimit 来删除满足 where 的部分数据。

删除单表例子

根据id删除一个学生

mysql> delete from students where id=1;
Query OK, 1 row affected (0.00 sec)

使用 order by limit 删除 id 最大的学生

mysql> delete from students order by id desc limit 1;
Query OK, 1 row affected (0.00 sec)

mysql> select * from students;
+----+------+--------+-----+------+---------------------+---------------------+
| id | no   | name   | sex | age  | created_at          | updated_at          |
+----+------+--------+-----+------+---------------------+---------------------+
|  2 | 0002 | 冷锋   |   2 |   25 | 2019-12-20 20:00:00 | 2019-12-20 20:00:00 |
|  3 | 0003 | 六一   |   2 |   25 | 2019-12-20 20:00:00 | 2019-12-20 20:00:00 |
|  4 | 0004 | 杨过   |   2 |   25 | 2019-12-20 00:26:14 | NULL                |
|  6 | 0006 | 铁蛋   |   2 |   25 | 2019-12-20 01:51:46 | NULL                |
+----+------+--------+-----+------+---------------------+---------------------+
4 rows in set (0.00 sec)

删除多表的例子

新建一个作业表并初始化一部分数据

mysql> CREATE TABLE `homeworks` (
    ->   `id` int NOT NULL AUTO_INCREMENT COMMENT '作业id',
    ->   `student_id` int NOT NULL COMMENT '学生学号',
    ->   `name` varchar(128) NOT NULL COMMENT '作业名字',
    ->   `status` tinyint NOT NULL DEFAULT '0' COMMENT '0 未做 1 已提交 2 已批改',
    ->   `content` text DEFAULT NULL COMMENT '作业内容',
    ->   `score` int not null default 0 comment '作业分数',
    ->   `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    ->   `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    ->   PRIMARY KEY (`id`),
    ->   index `student_id_index` (`student_id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='作业表';
Query OK, 0 rows affected (0.02 sec)

mysql>
mysql>
mysql>
mysql> insert into homeworks (`student_id`,`name`) values(3,'1+1'),(3,'2+2'),(2,'1+1');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from homeworks;
+----+------------+------+--------+---------+-------+---------------------+------------+
| id | student_id | name | status | content | score | created_at          | updated_at |
+----+------------+------+--------+---------+-------+---------------------+------------+
|  1 |          3 | 1+1  |      0 | NULL    |     0 | 2019-12-29 22:39:57 | NULL       |
|  2 |          3 | 2+2  |      0 | NULL    |     0 | 2019-12-29 22:39:57 | NULL       |
|  3 |          2 | 1+1  |      0 | NULL    |     0 | 2019-12-29 22:39:57 | NULL       |
+----+------------+------+--------+---------+-------+---------------------+------------+

删除 id=3 的学生及其所有作业

mysql> delete s,h from students s left join homeworks h on s.id=h.student_id where s.id=3;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from students;
+----+------+--------+-----+------+---------------------+------------+
| id | no   | name   | sex | age  | created_at          | updated_at |
+----+------+--------+-----+------+---------------------+------------+
|  4 | 0004 | 杨过   |   2 |   25 | 2019-12-20 00:26:14 | NULL       |
|  6 | 0006 | 铁蛋   |   2 |   25 | 2019-12-20 01:51:46 | NULL       |
+----+------+--------+-----+------+---------------------+------------+
2 rows in set (0.00 sec)

mysql> select * from homeworks;
+----+------------+------+--------+---------+-------+---------------------+------------+
| id | student_id | name | status | content | score | created_at          | updated_at |
+----+------------+------+--------+---------+-------+---------------------+------------+
|  1 |          1 | 1+1  |      0 | NULL    |     0 | 2019-12-29 22:39:57 | NULL       |
|  2 |          1 | 2+2  |      0 | NULL    |     0 | 2019-12-29 22:39:57 | NULL       |
+----+------------+------+--------+---------+-------+---------------------+------------+
2 rows in set (0.00 sec)

truncate

我们有时候需要清除数据库数据,我们可以使用 delete 也可以用 truncate,两者对比如下

  1. truncate 只能用于表,delete 可以用做表和视图
  2. delete语句为DML,这个操作会被放到 rollback segment中,事务提交后才生效。如果有 trigger,执行的时候也会触发。
  3. truncate DDL 操作立即生效,原数据不放到 rollback segment中,不能回滚。
  4. 有 FOREIGN KEY 的表不能执行 truncate,truncate 不返回影响的行数,truncate 执行后表中所有 AUTO_INCREMENT 的行会重置为 0,truncate 不记录到日志不触发 trigger 所以速度比 delete 快很多,但是我们要谨慎使用 truncate
作者头像

刘宇帅

非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。

提示

功能待开通!


相关文章

MySQL之创建库

MySQL 创建库语法 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification] ... create_specification: [DEFAULT] CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name 创建一个默认的数据库 create database school; 执行结果 mysql> create database school; Query OK, 1 row affecte

MySQL之创建表

创建表 创建学生表 SQL create table if not exists`students` ( `id` int not null auto_increment comment '学生id', `no` char(5) not null comment '学生学号', `name` varchar(128) not null default '' comment '学生姓名', `sex` tinyint not null default 0 comment '0 无 1 女 2 男', `age` tinyint null default

MySQL 技术内幕阅读笔记(0)--- InnoDB 体系结构和存储引擎

MySQL 体系结构 从图我们可以看出,MySQL 有如下几部分组成: 连接池组件 管理服务和工具组件 SQL 接口组件 查询优化组件 优化器组件 缓冲组件 插件式存储引擎 物理文件 需要注意存储引擎是基于表的而不是库,比如我们可以在建表的时候为表指明存储引擎。 MySQL 存储引擎 常见存储引擎 InnoDB MySQL 5.5.8 版本之后的默认存储引擎,事务性,行锁,支持外键。 MyISAM 存储引擎不支持事务、表锁,支持全文索引,主要面对一些 OLAP 数据库应用。MySQL 5.5.6 版本之前的默认存储引擎。 NDB 存储引擎是一个集群存储引擎。 Memory 存储引擎将表

查看 MySQL 表的大小

information_schema MySQL 自带一个数据库 information_schema ,这个数据库用于记录 MySQL 数据库的基本信息,比如数据库名,数据库的表,表栏的数据类型与访问权限等。 mysql> use information_schema; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql>

高性能MySQL阅读笔记(0)--- 选择优化的数据类型

MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。不管存储哪种数据类型,下面几个简单的原则都有助于做出更好的选择。 更小的通常更好 一般情况下,尽可能使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为他们占用的更少的磁盘、内存和CPU缓存,处理时需要的CPU周期更少。 简单最好 简单的数据类型的操作通常需要更少的CPU周期。例如整数比字符操作代价更低,因为字符集和校对规则使字符串比较比整型更复杂。 两个实际使用中的例子,一个是使用MySQL内置的类型而不是字符串存储时间,另一个是使用整型而不是字符串存储IP。 尽量避免NULL 很多表都包含可为 NULL