目录
二、GaussDB的 DROP & TRUNCATE & DELETE 简述
在数据库中,SQL作为一种常用的数据库编程语言,扮演着至关重要的角色。SQL不仅可以用于创建、修改和查询数据库,还可以通过DROP、DELETE和TRUNCATE等语句来删除数据。这些语句是SQL语言中的最常用的命令,且它们有着不同的含义和使用场景。
本文以GaussDB数据库为平台,将详细介绍SQL中DROP、TRUNCATE和DELETE等语句的含义、使用场景以及注意事项,帮助读者更好地理解和掌握这些常用的数据库操作命令。
大类 | DROP | TRUNCATE | DELETE |
SQL类型 | DDL | DDL | DML |
删除内容 | 删除表的所有数据,包括表结构、索引和权限等 | 删除表中所有数据,或指定分区的数据 | 删除表的全部或部分(+条件)数据 |
执行速度 | 速度最快 | 速度中等 | 速度最慢 |
Tip:在GaussDB数据库中,DROP是用于定义或修改数据库中的对象的命令之一。对象主要包括:库、模式、表空间、表、索引、视图、存储过程、函数、加密秘钥等,本次只针对表的操作。
DROP TABLE的功能是用来删除已存在的Table。
DROP TABLE [IF EXISTS] [db_name.]table_name;
说明:SQL中加[IF EXISTS] ,可以防止因表不存在而导致执行报错。
参数:db_name:Database名称。如果未指定,将选择当前database。table_name:需要删除的Table名称。
以下示例演示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)查看执行结果
从表或表分区中移除所有数据,TRUNCATE快速地从表中删除所有行。它和在目标表上进行无条件的DELETE有同样的效果,但由于TRUNCATE不做表扫描,因而快得多, 且使用的系统和事务日志资源少。在大表上操作效果更明显。
TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。
TRUNCATE [TABLE] table_name;
或
ALTER TABLE [IF EXISTS] table_name TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) }
参数:table_name:需要删除数据的Table名称。partition_name:需要删除的分区表的分区名称。partition_value:需要删除的分区表的分区值。
以下示例演示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)查看执行结果
以下示例演示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)根据分区进行删数据
从指定的表里删除满足WHERE子句的行。如果WHERE子句不存在,将删除表中所有行,结果只保留表结构。
DELETE FROM table_name [WHERE condition];
参数:table_name:需要删除数据的Table名称。condition:用于判断哪些行需要被删除。
复用前面的实验表:
DELETE FROM orders WHERE customer_id <200;
1)删除orders表中customer_id <200的所有数据:
在GaussDB等数据库中,DROP、TRUNCATE和DELETE均是常用的删除数据的命令。但在实际业务使用中,需要根据不同的需求进行准确的选择,但无论选择那种删数方式,都需要考虑数据安全性——重要的事情说三遍:备份!备份!备份!
——结束。