写点什么

详解数据库 SQL 中的三个语句:DROP、TRUNCATE 、DELETE

  • 2023-11-16
    广东
  • 本文字数:2902 字

    阅读完需:约 10 分钟

详解数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE

本文分享自华为云社区《GaussDB数据库SQL系列-DROP & TRUNCATE & DELETE》,作者:Gauss 松鼠会小助手 2 。

一、前言


在数据库中,SQL 作为一种常用的数据库编程语言,扮演着至关重要的角色。SQL 不仅可以用于创建、修改和查询数据库,还可以通过 DROP、DELETE 和 TRUNCATE 等语句来删除数据。这些语句是 SQL 语言中的最常用的命令,且它们有着不同的含义和使用场景。


本文以 GaussDB 数据库为平台,将详细介绍 SQL 中 DROP、TRUNCATE 和 DELETE 等语句的含义、使用场景以及注意事项,帮助读者更好地理解和掌握这些常用的数据库操作命令。

二、GaussDB 的 DROP & TRUNCATE & DELETE 简述

1、简述


• DROP 语句可以删除整个表,包括表结构和数据;

• TRUNCATE 语句则可以快速地删除表中的所有数据,但不删除表结构。

• DELETE 语句可以删除表中的数据,不包括表结构;

2、命令比对



Tip:在 GaussDB 数据库中,DROP 是用于定义或修改数据库中的对象的命令之一。对象主要包括:库、模式、表空间、表、索引、视图、存储过程、函数、加密秘钥等,本次只针对其对表的操作。

三、GaussDB 的 DROP TABLE 命令及示例

1、功能描述


DROP TABLE 的功能是用来删除已存在的 Table。

2、语法


DROP TABLE [IF EXISTS] [db_name.]table_name;
复制代码


说明:SQL 中加[IF EXISTS] ,可以防止因表不存在而导致执行报错。


参数:db_name:Database 名称。如果未指定,将选择当前 database。table_name:需要删除的 Table 名称。

3、示例


以下示例演示 DROP 命令的使用,依次执行如下 SQL 语句:


--删除整个表course
DROP TABLE IF EXISTS course
--创建course表
CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));
--初始化数据
INSERT INTO course VALUES('01' , '语文' , '02');
INSERT INTO course VALUES('02' , '数学' , '01');
INSERT INTO course VALUES('03' , '英语' , '03');
--3条记录
SELECT count(1) FROM course;
--删除整个表
DROP TABLE IF EXISTS course
--查看结果,表不存在(表结构及数据不存在)
SELECT count(1) FROM course;
复制代码

1)DROP TABLE,提示表不存在


2)创建并初始化一张实验表


3)DROP TABLE 执行成功


4)查看执行结果


四、GaussDB 的 TRUNCATE 命令及示例

1、功能描述


从表或表分区中移除所有数据,TRUNCATE 快速地从表中删除所有行。它和在目标表上进行无条件的 DELETE 有同样的效果,但由于 TRUNCATE 不做表扫描,因而快得多, 且使用的系统和事务日志资源少。在大表上操作效果更明显。


TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。

2、语法


TRUNCATE [TABLE] table_name;
复制代码



ALTER TABLE [IF EXISTS] table_name TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) }
复制代码


参数:table_name:需要删除数据的 Table 名称。partition_name:需要删除的分区表的分区名称。partition_value:需要删除的分区表的分区值。

3、示例 1


以下示例演示 TRUNCATE 命令的使用:


--创建course表
DROP TABLE IF EXISTS course;
CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));
--初始化数据
INSERT INTO course VALUES('01' , '语文' , '02');
INSERT INTO course VALUES('02' , '数学' , '01');
INSERT INTO course VALUES('03' , '英语' , '03');
--3条记录
SELECT count(1) FROM course;
--清空表
TRUNCATE TABLE course;
--或
TRUNCATE course;
--0条记录
SELECT count(1) FROM course;
复制代码

1)创建实验表并初始化数据


2)TRUNCATE TABLE 执行成功


3)查看执行结果


4、示例 2


以下示例演示 TRUNCATE 命令的删除分区表数据


--创建列表分区(LIST)
DROP TABLE IF EXISTS orders;
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
product_id INT,
quantity INT
) PARTITION BY LIST (customer_id) (
PARTITION p1 VALUES (100),
PARTITION p2 VALUES (200),
PARTITION p3 VALUES (300),
PARTITION p4 VALUES (400),
PARTITION p5 VALUES (500)
);
--插入测试数据
INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1001,100,date'20230822',1,10);
INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1002,100,date'20230822',2,20);
INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1003,100,date'20230822',3,30);
INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1004,200,date'20230822',4,40);
--查看分区p1、p2的数据
SELECT * FROM orders WHERE customer_id IN (100,200);
--或
--根据分区名称查询
SELECT * FROM orders PARTITION(p2);
--清空分区p1。
ALTER TABLE orders TRUNCATE PARTITION p1;
--或者
--清空分区p2=200。
ALTER TABLE orders TRUNCATE PARTITION for (200);
--查看分区p1、p2的数据
SELECT * FROM orders WHERE customer_id IN (100,200);
复制代码

1)创建实验表并初始化


2)根据分区进行删数据


五、GaussDB 的 DELETE 命令及示例

1、功能描述


从指定的表里删除满足 WHERE 子句的行。如果 WHERE 子句不存在,将删除表中所有行,结果只保留表结构。

2、注意事项


• 不支持 DELETE 语句中使用 LIMIT。应使用 WHERE 条件明确需要更新的目标行。

• 不支持在单条 SQL 语句中,对多个表进行删除。

• DELETE 语句中必须有 WHERE 子句,避免全表扫描。

• DELETE 语句中禁止不应使用 ORDER BY、GROUP BY 子句,避免不必要的排序。

• 如果需要清空一张表,建议使用 TRUNCATE,而不是 DELETE。

• TRUNCATE 会创建新的物理文件,并在事务结束时将原文件物理删除,清空磁盘空间。而 DELETE 会将表中数据进行标记,直到 VACCUUM FULL 阶段才会真正清理磁盘空间。

• DELETE 有主键或索引的表,WHERE 条件应结合主键或索引,提高执行效率。

• DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。

• 如果想保留标识计数值,请改用 DELETE

3、语法


DELETE FROM table_name [WHERE condition];
复制代码


参数:table_name:需要删除数据的 Table 名称。condition:用于判断哪些行需要被删除。

4、示例


复用前面的实验表:


1)删除 orders 表中 customer_id <200 的所有数据:


DELETE FROM orders WHERE customer_id <200;
复制代码


六、应用场景


• 需要根据一定的业务条件删除数据时、且数据量、性能可控的情况下,可以考虑使用 DELETE。

• 需要删除大批量数据时,同时要求速度快,效率高并且无需撤销时,可以使用 TRUNCATE。

• 在企业级开发中,实际上都是进行逻辑删除(将数据进行“删除标识”处理)、而并不进行物理上的删除。

• 在实际生产环境中,一般情况下删除业务处理(过渡表)中的数据。

• 在实际企业开发、维护过程中,不管使用 DELETE、TRUNCATE 还是 DROP 命令前,都要考虑数据的备份。

七、小结


在 GaussDB 等数据库中,DROP、TRUNCATE 和 DELETE 均是常用的删除数据的命令。但在实际业务使用中,需要根据不同的需求进行准确的选择,但无论选择那种删数方式,都需要考虑数据安全性——重要的事情说三遍:备份!备份!备份!


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
详解数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE_数据库_华为云开发者联盟_InfoQ写作社区