MySQL Truncate表

MySQL 中的 TRUNCATE 语句删除完整数据而不删除其结构。它是DDL 或数据定义语言 命令的一部分。通常,当我们想从表中删除整个数据而不删除表结构时,我们会使用此命令。

TRUNCATE 命令与 DELETE 命令的工作方式相同,但不使用从表中删除完整行的WHERE 子句。但是,TRUNCATE 命令比DELETE命令更有效,因为它删除并重新创建表,而不是一次删除单个记录。由于此命令在内部删除表并重新创建它,因此受 truncate 语句影响的行数为零,这与返回已删除行数的 delete 语句不同。

该命令在执行期间不维护事务日志。它释放数据页而不是行,并为释放页而不是事务日志中的行创建一个条目。此命令还锁定页面而不是行;因此,它需要更少的锁和资源。

使用 TRUNCATE 命令时必须考虑以下几点:

  • 我们不能在此命令中使用WHERE子句,因此无法过滤记录。
  • 执行此命令后,我们无法回滚已删除的数据,因为执行此操作时不会维护日志。
  • 当表被外键引用或参与索引视图时,我们不能使用 truncate 语句。
  • TRUNCATE 命令不会触发与被截断的表关联的 DELETE触发器,因为它不对单个行进行操作。

一、MySQL Truncate表的语法

以下语法解释了从表中删除数据的 TRUNCATE 命令:

TRUNCATE [TABLE] table_name;  

在这种语法中,首先,我们将指定要删除哪些数据的表名。语法中的 TABLE 关键字不是必需的。但是使用它来区分TRUNCATE() 函数和TRUNCATE TABLE 语句是一个很好的做法。

二、MySQL Truncate表的示例

让我们通过一个示例来演示如何Truncate表格。首先,我们将使用以下语句创建一个名为“ customer ”的表:

CREATE TABLE customer (    
    Id int PRIMARY KEY NOT NULL,     
    Name varchar(45) NOT NULL,     
    Product varchar(45) DEFAULT NULL,     
    Country varchar(25) DEFAULT NULL,     
    Year int NOT NULL    
);    

接下来,我们将使用以下语句向该表添加值:

INSERT INTO customer ( Id, Name, Product, Country, Year)     
VALUES (1, 'Stephen', 'Computer', 'USA', 2015),     
(2, 'Joseph', 'Laptop', 'India', 2016),     
(3, 'John', 'TV', 'USA', 2016),    
(4, 'Donald', 'Laptop', 'England', 2015),    
(5, 'Joseph', 'Mobile', 'India', 2015),    
(6, 'Peter', 'Mouse', 'England', 2016);  

现在,通过执行SELECT 语句来验证表是否插入记录:

mysql> SELECT * FROM customer;    

我们将得到输出,如下所示:

现在,执行以下语句,使用上面讨论的 TRUNCATE 语法Truncate表 customer:

mysql> TRUNCATE TABLE customer;  

执行成功后,我们会得到如下输出:

如我们所见,即使删除了所有表记录,此查询也会返回0 行受到影响。我们可以通过再次执行 SELECT 语句来验证数据的删除。此命令提供以下输出,显示表中不存在任何记录:

三、如何利用外键Truncate表

如果我们对使用外键约束的表执行 TRUNCATE 操作,我们将得到以下错误:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails  

在这种情况下,我们需要登录到MySQL

服务器并在执行 TRUNCATE 语句之前禁用外键检查,如下所示:
SET FOREIGN_KEY_CHECKS=0;  

现在,我们可以截断表。执行后,重新启用外键检查,如下所示:

SET FOREIGN_KEY_CHECKS=1;  

四、如何Truncate MySQL的所有表

MySQL 中的 TRUNCATE 语句一次只会删除一个表。如果我们要删除多个表,我们需要执行单独的 TRUNCATE 语句。下面的例子展示了如何在 MySQL 中Truncate 多个表:

TRUNCATE TABLE table_name1;  
TRUNCATE TABLE table_name2;  
TRUNCATE TABLE table_name3;  

我们还可以使用以下 SQL 查询,该查询使用数据库中的表名一次生成多个 TRUNCATE TABLE 命令:

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME)  
FROM INFORMATION_SCHEMA.TABLES  
WHERE table_schema = 'database_name';  

 

热门文章

优秀文章