SQL TRUNCATE表格
SQL提供了一个命令,可以一次完全清空一个表,而不是逐个删除表记录,这将非常耗时和麻烦。
SQL TRUNCATE TABLE语句
SQL TRUNCATE TABLE 命令用于完全清空一个表。这个命令是DROP TABLE和CREATE TABLE语句的序列,需要DROP权限。
你也可以使用DROP TABLE命令删除一个表,但它将从数据库中删除完整的表结构,如果想要再次存储一些数据,你需要重新创建这个表。
语法
TRUNCATE TABLE 命令的基本语法如下。
TRUNCATE TABLE table_name;
示例
首先,让我们创建一个表 CUSTOMERS ,用于存储客户的个人详细信息,包括姓名、年龄、地址和薪水等,如下所示:
CREATE TABLE CUSTOMERS (
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
现在使用INSERT语句将值插入到这个表中,如下所示−
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'Pune', 4500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Muffy', 24, 'Indore', 10000.00 );
表格将如下创建:
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | Pune | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
以下SQL语句 TRUNCATE TABLE CUSTOMER 将删除CUSTOMERS表中的所有记录-
TRUNCATE TABLE CUSTOMERS;
验证
现在,CUSTOMERS表已被截断,SELECT语句的输出将如下代码块所示-
SELECT * FROM CUSTOMERS;
以下将是输出结果:
Empty set (0.00 sec)
TRUNCATE vs DELETE
尽管TRUNCATE和DELETE命令在逻辑上相似,但它们之间存在一些重大区别。这些区别在下表中详述。
删除(DELETE) | 截断(TRUNCATE) |
---|---|
SQL中的DELETE命令根据WHERE子句中指定的条件从表中删除一行或多行。 | SQL的TRUNCATE命令用于从表中删除所有行,无论是否满足任何条件。 |
它是一条DML(数据操作语言)命令。 | 它是一条DDL(数据定义语言)命令。 |
在对DELETE命令进行更改后,需要手动进行COMMIT操作才能使修改生效。 | 当使用TRUNCATE命令时,对表的修改会自动提交。 |
它逐个删除行,并对每个删除应用相同的条件。 | 它一次性删除所有信息。 |
在这种情况下,WHERE子句用作条件。 | WHERE子句不可用。 |
删除后所有行都会被锁定。 | TRUNCATE使用表锁定,锁定页面以防止删除。 |
它会在日志文件中记录每个事务。 | 只记录数据存储在其上的页面的释放活动。 |
它比TRUNCATE命令消耗更多的事务空间。 | 它消耗较少的事务空间。 |
如果存在标识列,则不会将表标识重置为创建表时的值。 | 它将表的标识返回到给定的种子值。 |
它需要授权才能删除。 | 它需要表更改的权限。 |
对于大型数据库,速度比较慢。 | 速度比较快。 |
TRUNCATE vs DROP
与TRUNCATE不同的是,DROP命令会完全释放内存中的表空间,而TRUNCATE只会重置表结构。它们都是数据定义语言(DDL)操作,因为它们与数据库对象的定义进行交互;一旦执行了这些命令,数据库会自动提交,并且无法回滚。
然而,这两个命令仍然存在一些区别,总结如下表:
DROP | TRUNCATE |
---|---|
DROP命令用于从数据库中删除整个表,包括其定义、索引、约束、数据等。 | TRUNCATE命令用于从表中删除所有行,无论是否满足任何条件,并重置表的定义。 |
它是DDL(数据定义语言)命令。 | 它也是DDL(数据定义语言)命令。 |
表空间完全从内存中释放。 | 表仍然存在于内存中。 |
所有完整性约束被删除。 | 完整性约束仍然存在于表中。 |
需要对表模式和表分别拥有ALTER和CONTROL权限,才能执行此命令。 | 只需要ALTER权限即可截断表。 |
DROP命令比TRUNCATE慢,但比DELETE快。 | TRUNCATE命令比DROP和DELETE命令都快。 |