• GaussDB数据库SQL系列:DROP & TRUNCATE & DELETE


    目录

    一、前言

    二、GaussDB的 DROP & TRUNCATE & DELETE 简述

    1、命令简述

    2、命令比对

    三、GaussDB的DROP TABLE命令及示例

    1、功能描述

    2、语法

    3、示例

    四、GaussDB的TRUNCATE命令及示例

    1、功能描述

    2、语法

    3、示例

    4、示例

    五、GaussDB的DELETE命令及示例

    1、功能描述

    2、注意事项

    3、语法

    4、示例

    六、应用场景

    七、小结

    一、前言

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

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

    二、GaussDB的 DROP & TRUNCATE & DELETE 简述

    1、简述

    • DROP语句可以删除整个表,包括表结构和数据等;
    • TRUNCATE语句则可以快速地删除表中的所有数据,但不删除表结构。
    • DELETE语句可以根据条件删除表中的数据,但不包括表结构;

    2、命令比对

    大类

    DROP

    TRUNCATE

    DELETE

    SQL类型

    DDL

    DDL

    DML

    删除内容

    删除表的所有数据,包括表结构、索引和权限等

    删除表中所有数据,或指定分区的数据

    删除表的全部或部分(+条件)数据

    执行速度

    速度最快

    速度中等

    速度最慢

    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语句:

    1. --删除整个表course
    2. DROP TABLE IF EXISTS course
    3. --创建course表
    4. CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));
    5. --初始化数据
    6. INSERT INTO course VALUES('01' , '语文' , '02');
    7. INSERT INTO course VALUES('02' , '数学' , '01');
    8. INSERT INTO course VALUES('03' , '英语' , '03');
    9. --3条记录
    10. SELECT count(1) FROM  course;
    11. --删除整个表
    12. DROP TABLE IF EXISTS course
    13. --查看结果,表不存在(表结构及数据不存在)
    14. 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命令的使用:

    1. --创建course表
    2. DROP TABLE IF EXISTS course;
    3. CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));
    4. --初始化数据
    5. INSERT INTO course VALUES('01' , '语文' , '02');
    6. INSERT INTO course VALUES('02' , '数学' , '01');
    7. INSERT INTO course VALUES('03' , '英语' , '03');
    8. --3条记录
    9. SELECT count(1) FROM  course;
    10. --清空表
    11. TRUNCATE TABLE course;
    12. --或
    13. TRUNCATE course;
    14. --0条记录
    15. SELECT count(1) FROM  course;

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

     2)TRUNCATE TABLE执行成功

     3)查看执行结果

    4、示例2

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

    1. --创建列表分区(LIST)
    2. DROP TABLE IF EXISTS orders;
    3. CREATE TABLE orders (
    4.     id INT PRIMARY KEY,
    5.     customer_id INT,
    6.     order_date DATE,
    7.     product_id INT,
    8.     quantity INT
    9. ) PARTITION BY LIST (customer_id) (
    10.     PARTITION p1 VALUES (100),
    11.     PARTITION p2 VALUES (200), 
    12.     PARTITION p3 VALUES (300),
    13.     PARTITION p4 VALUES (400),
    14.     PARTITION p5 VALUES (500)
    15. );
    16. --插入测试数据
    17. INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1001,100,date'20230822',1,10);
    18. INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1002,100,date'20230822',2,20);
    19. INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1003,100,date'20230822',3,30);
    20. INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1004,200,date'20230822',4,40);
    21. --查看分区p1、p2的数据
    22. SELECT * FROM orders WHERE customer_id IN (100,200);
    23. --或
    24. --根据分区名称查询
    25. SELECT * FROM  orders PARTITION(p2);
    26. --清空分区p1。
    27. ALTER TABLE orders TRUNCATE PARTITION p1;
    28. --或者
    29. --清空分区p2=200。
    30. ALTER TABLE orders TRUNCATE PARTITION for (200);
    31. --查看分区p1、p2的数据
    32. 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、示例

    复用前面的实验表:

    DELETE FROM orders WHERE  customer_id <200;

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

    六、应用场景

    • 需要根据一定的业务条件删除数据时、且数据量、性能可控的情况下,可以考虑使用 DELETE。
    • 需要删除大批量数据时,同时要求速度快,效率高并且无需撤销时,可以使用 TRUNCATE。
    • 在企业级开发中,实际上都是进行逻辑删除(将数据进行“删除标识”处理)、而并不进行物理上的删除。
    • 在实际生产环境中,一般情况下删除业务处理(过渡表)中的数据。
    • 在实际企业开发、维护过程中,不管使用 DELETE、TRUNCATE还是DROP命令前,都要考虑数据的备份。

    七、小结

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

    ——结束。

  • 相关阅读:
    求一个网页设计作业——个人博客(HTML+CSS)
    闯关无边界时代,荣耀与华为全场景OS相见
    运行环境配置——Node.js
    回调地狱(嵌套金字塔)及promise语法
    mybatis入门
    Go 事,Gopher 要学的数字类型,变量,常量,运算符 ,第2篇
    (十五)MyBatis的注解式开发
    SUS系统可用性量表
    leetcode 135. 分发糖果
    第一届全国高校将计算机技能大赛知识点整理
  • 原文地址:https://blog.csdn.net/GaussDB/article/details/132487990