首页 > 数据库 >MySQL删除数据的三种方式:delete、drop、truncate的区别

MySQL删除数据的三种方式:delete、drop、truncate的区别

时间:2022-12-01 17:36:00浏览次数:65  
标签:INSERT truncate 删除 drop VALUES ex MySQL delete

本篇主要讨论MySQL删除数据的三种方式:delete、drop、truncate的区别

当行数据批量delete时,InnoDB如何处理自增ID的

目录

参考来源:

https://www.51cto.com/article/708260.html

以下步骤根据上面的参考来源进行验证:

1、建表

CREATE DATABASE del;
use del;
CREATE TABLE ex(
id INT NOT NULL PRIMARY KEY auto_increment,
name VARCHAR(10) UNIQUE
);
-----------------------------------
CREATE TABLE ex_2(
id INT NOT NULL PRIMARY KEY auto_increment,
name VARCHAR(10) UNIQUE
);

2、插入数据

INSERT INTO ex VALUES(1,'name');
INSERT INTO ex_2 VALUES(1,'name');
-- 插入多条
INSERT INTO ex(name) VALUES('name2'),('name3'),('name4')
INSERT INTO ex_2(name) VALUES('name2'),('name3'),('name4');

此时查看表:

image-20221201170055181

3、删除数据

delete

-- 删除所有数据
DELETE FROM ex;

此时执行 SELECT * FROM ex:表结构还存在,数据已被删除

truncate

TRUNCATE ex_2;

此时执行 SELECT * FROM ex:表结构还存在,数据已被删除

drop

DROP TABLE ex_2;
# 1146 - Table 'del.ex_2' doesn't exist

!!! 直接把表也给删了!

4、再次插入数据

使用过delect情况下:

INSERT INTO ex VALUES(0,'000');

INSERT INTO ex VALUES(1,'111');

INSERT INTO ex(name) VALUES('222');

现在再执行SELECT * FROM ex,发现:自增列计数并不会从头开始

image-20221201165452952

使用过truncate情况下

-- 插入成功
INSERT INTO ex_2 VALUES(0,'000');
-- 插入失败:1062 - Duplicate entry '1' for key 'PRIMARY'
INSERT INTO ex_2 VALUES(1,'111');
-- 插入成功
INSERT INTO ex_2(name) VALUES('222');

现在再执行SELECT * FROM ex,发现:自增列计数复原

image-20221201171237777

使用 drop 的话表都直接干没

5、结论

批量删除数据有三种常见的方法:

(1) drop table:直接表都删没;当不需要该表时,可以使用该方法。

(2) truncate table:删除所有数据,同时保留表,速度很快。

画外音:可以理解为,drop table然后再create table。

(3) delete from table:可以删除所有数据,也能保留表,但性能较差。也可以带where条件删除部分数据,灵活性强。

虽然truncate和delete都能够删除所有数据,且保留表,但他们之间是有明显差异的。

区别

(1)

  • truncate是DDL语句,它不存在所谓的“事务回滚”;
  • delete是DML语句,它执行完是可以rollback的。

(2)

  • truncate table返回值是0;
  • delete from table返回值是被删除的行数。

(3) InnoDB支持一个表一个文件,此时:

  • truncate会一次性把表干掉,且不会激活触发器,速度非常快;
  • delete from table则会一行一行删除,会激活触发器,速度比较慢。

画外音:delete数据,是要记录日志的,truncate表不需要记录日志。

(4) 当表中有列被其它表作为外键(foreign key)时:

  • truncate会是失败;
  • delete则会成功。

画外音:这类数据删除失败很容易定位问题,因为报错提示简单易懂。

(5) 当表中有自增列时:

  • truncate会使得自增列计数复原;
  • delete所有数据后,自增列计数并不会从头开始。

画外音:因此,delete所有数据后,自增列计数的这个行为,往往不是用户想要的,所以是一个潜在坑。

标签:INSERT,truncate,删除,drop,VALUES,ex,MySQL,delete
From: https://www.cnblogs.com/fulfill/p/16942115.html

相关文章

  • 高新能MySQL闲杂笔记
    https://blog.csdn.net/welongfor/article/details/86622790在这里插入图片描述......
  • mysql索引,事务,视图,存储过程,存储引擎
    一,索引1.概念索引:提供指向存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。索引就......
  • mysql间隙锁加锁11个规则
        间隙锁是在可重复读隔离级别下才会生效的:next-keylock实际上是由间隙锁加行锁实现的,如果切换到读提交隔离级别(read-committed)的话,就好理解了,过程中去掉......
  • Docker 安装 MySQL
    1、查看可用的MySQL版本访问MySQL镜像库地址:https://hub.docker.com/_/mysql?tab=tags 。可以通过Sortby查看其他版本的MySQL,默认是最新版本 mysql:latest 。......
  • MYSQL IN 是否走索引?
    准备工作CREATETABLEt(idINTNOTNULLAUTO_INCREMENT,key1VARCHAR(100),common_fieldVARCHAR(100),PRIMARYKEY(id),KEYidx_key1(ke......
  • MySQL 间隙锁导致的死锁场景分析
    实际业务场景在我们使用mysql的时候,如果不注意间隙锁容易引起死锁,最近分析一个业务场景就是间隙锁导致的死锁,业务抽象如下:系统有一个批量新增业务资源的功能,实现逻辑如下......
  • MySQL数据库-数据完整性-笔记
    数据完整性一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证......
  • MongoDB和mysql的区别
    一.什么是MongoDBMongoDB是一个基于分布式文件存储的数据库。由C++语言编写,是一个开源数据库系统。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一......
  • MySQL数据库-安装-笔记
    1.服务器端安装安装服务器端:在终端中输入如下命令,回车后,然后按照提示输入sudoapt-getinstallmysql-server当前使用的ubuntu镜像中已经安装好了mysql服务器端,无需再安装,并......
  • MySQL数据库-Navicat图形界面工具操作-笔记
    1.Navicat连接打开navicat,点击工具栏的“连接”,选择“mysql”,弹出窗口如下图在弹出的窗口中填写名称、主机ip、端口、用户名、密码,如下图密码为mysql点击确定,在左侧栏会看到......