深化解析-MySQL-DELETE-中的删除语句-TRUNCATE-和-DROP (深入解析)
一、前言
在数据库中,SQL作为一种罕用的数据库编程言语,表演着至关关键的角色。SQL不只可以用于创立、修正和查问数据库,还可以经过DROP、DELETE和TRUNCATE等语句来删除数据。这些语句是SQL言语中的最罕用的命令,且它们有着不同的含意和经常使用场景。
本文以GaussDB数据库为平台,将具体引见SQL中DROP、TRUNCATE和DELETE等语句的含意、经常使用场景以及留意事项,协助读者更好地理解和把握这些罕用的数据库操作命令。
二、GaussDB的DROP&TRUNCATE&DELETE简述
1、简述
2、命令比对
大类 |
|||
SQL类型 |
|||
删除内容 |
删除表的一切数据,包含表结构、索引和权限等 |
删除表中一切数据,或指定分区的数据 |
删除表的所有或局部(+条件)数据 |
口头速度 |
速度最快 |
速度中等 |
速度最慢 |
Tip:在GaussDB数据库中,DROP是用于定义或修负数据库中的对象的命令之一。对象关键包含:库、形式、表空间、表、索引、视图、存储环节、函数、加密秘钥等,本次只针对其对表的操作。
三、GaussDB的DROPTABLE命令及示例
1、性能形容
DROPTABLE的性能是用来删除已存在的Table。
2、语法
DROPTABLE[IFEXISTS][db_name.]table_name;
说明:SQL中加[IFEXISTS],可以防止因表不存在而造成口头报错。
参数:db_name:Database称号。假设未指定,将决定以后database。table_name:须要删除的Table称号。
3、示例
以下示例展示DROP命令的经常使用,依次口头如下SQL语句:
--删除整个表courseDROPTABLEIFEXISTScourse--创立course表CREATETABLEcourse(cidVARCHAR(10),cnameVARCHAR(10),teidVARCHAR(10));--初始化数据INSERTINTOcourseVALUES('01','语文','02');INSERTINTOcourseVALUES('02','数学','01');INSERTINTOcourseVALUES('03','英语','03');--3条记载SELECTcount(1)FROMcourse;--删除整个表DROPTABLEIFEXISTScourse--检查结果,表不存在(表结构及数据不存在)SELECTcount(1)FROMcourse;
1)DROPTABLE,提醒表不存在
2)创立并初始化一张试验表
图片
3)DROPTABLE口头成功
4)检查口头结果
四、GaussDB的TRUNCATE命令及示例
1、性能形容
从表或表分区中移除一切数据,TRUNCATE极速地从表中删除一切行。它和在指标表上启动无条件的DELETE有雷同的成果,但由于TRUNCATE不做表扫描,因此快得多,且经常使用的系统和事务日志资源少。在大表上操作成果更清楚。
TRUNCATETABLE删除表中的一切行,但表结构及其列、解放、索引等坚持不变。新行标识所用的计数值重置为该列的种子。
2、语法
TRUNCATE[TABLE]table_name;
或:
ALTERTABLE[IFEXISTS]table_nameTRUNCATEPARTITION{partition_name|FOR(partition_value[,...])}
参数:table_name:须要删除数据的Table称号。partition_name:须要删除的分区表的分区称号。partition_value:须要删除的分区表的分区值。
3、示例1
以下示例展示TRUNCATE命令的经常使用:
--创立course表DROPTABLEIFEXISTScourse;CREATETABLEcourse(cidVARCHAR(10),cnameVARCHAR(10),teidVARCHAR(10));--初始化数据INSERTINTOcourseVALUES('01','语文','02');INSERTINTOcourseVALUES('02','数学','01');INSERTINTOcourseVALUES('03','英语','03');--3条记载SELECTcount(1)FROMcourse;--清空表TRUNCATETABLEcourse;--或TRUNCATEcourse;--0条记载SELECTcount(1)FROMcourse;
1)创立试验表并初始化数据
2)TRUNCATETABLE口头成功
3)检查口头结果
4、示例2
以下示例展示TRUNCATE命令的删除分区表数据:
--创立列表分区(LIST)DROPTABLEIFEXISTSorders;CREATETABLEorders(idINTPRIMARYKEY,customer_idINT,order_dateDATE,product_idINT,quantityINT)PARTITIONBYLIST(customer_id)(PARTITIONp1VALUES(100),PARTITIONp2VALUES(200),PARTITIONp3VALUES(300),PARTITIONp4VALUES(400),PARTITIONp5VALUES(500));--拔出测试数据INSERTINTOorders(id,customer_id,order_date,product_id,quantity)VALUES(1001,100,date'20230822',1,10);INSERTINTOorders(id,customer_id,order_date,product_id,quantity)VALUES(1002,100,date'20230822',2,20);INSERTINTOorders(id,customer_id,order_date,product_id,quantity)VALUES(1003,100,date'20230822',3,30);INSERTINTOorders(id,customer_id,order_date,product_id,quantity)VALUES(1004,200,date'20230822',4,40);--检查分区p1、p2的数据SELECT*FROMordersWHEREcustomer_idIN(100,200);--或--依据分区称号查问SELECT*FROMordersPARTITION(p2);--清空分区p1。ALTERTABLEordersTRUNCATEPARTITIONp1;--或许--清空分区p2=200。ALTERTABLEordersTRUNCATEPARTITIONfor(200);--检查分区p1、p2的数据SELECT*FROMordersWHEREcustomer_idIN(100,200);
1)创立试验表并初始化
2)依据分区启动删数据
五、GaussDB的DELETE命令及示例
1、性能形容
从指定的表里删除满足WHERE子句的行。假设WHERE子句不存在,将删除表中一切行,结果只保管表结构。
2、留意事项
3、语法
DELETEFROMtable_name[WHEREcondition];
参数:table_name:须要删除数据的Table称号。condition:用于判别哪些行须要被删除。
4、示例
复用前面的试验表:
1)删除orders表中customer_id<200的一切数据:
DELETEFROMordersWHEREcustomer_id<200;
六、运行场景
七、小结
在GaussDB等数据库中,DROP、TRUNCATE和DELETE均是罕用的删除数据的命令。但在实践业务经常使用中,须要依据不同的需求启动准确的决定,但无论决定那种删数形式,都须要思考数据安保性——关键的事件说三遍:备份!备份!备份!
drop、truncate、delete三种删除的区别
drop:drop table 表名 (删除整个表)
删除内容和定义,并释放空间。执行drop语句,将使此表的结构一起删除。也就是删除整个表。操作不能回滚。
truncate:truncate table 表名(清空表中的所有数据)
删除内容、释放空间但不删除定义(也就是保留表的数据结构)。与drop不同的是,只是清空表数据而已。 truncate不能删除行数据,虽然只删除数据,但是比delete彻底,它只删除表数据。操作不能回滚。整表数据清空。
delete:delete from 表名 (where 列名 = 值) (删除一行数据)
与truncate类似,delete也只删除内容、释放空间但不删除定义;但是delete即可以对行数据进行删除,也可以对整表数据进行删除。delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行进行回滚操作。
原文链接:
详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始
相同点和不带where子句的delete、以及drop都会删除表内的数据。 、truncate都是DDL语句(数据定义语言),执行后会自动提交。 不同点:1. truncate 和 delete 只删除数据不删除表的结构(定义)drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。 2. delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。 truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。 语句不影响表所占用的 extent,高水线(high watermark)保持原位置不动drop 语句将表所占用的空间全部释放。 truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;truncate 会将高水线复位(回到最开始)。 4.速度,一般来说: drop> truncate > delete5.安全性:小心使用 drop 和 truncate,尤其没有备份的时候.否则哭都来不及使用上,想删除部分数据行用 delete,注意带上where子句. 回滚段要足够大.想删除表,当然用 drop想保留表而将所有数据删除,如果和事务无关,用truncate即可。 如果和事务有关,或者想触发trigger,还是用delete。 如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。 是DML语句,不会自动提交。 drop/truncate都是DDL语句,执行后会自动提交。 7、TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。 但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。 DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。 TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 8、TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。 新行标识所用的计数值重置为该列的种子。 如果想保留标识计数值,请改用 DELETE。 如果要删除表定义及其数据,请使用 DROP TABLE 语句。 9、对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。 由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。 10、TRUNCATE TABLE 不能用于参与了索引视图的表。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。