MySQL TRUNCATE 表格
MySQL中的TRUNCATE语句在不删除其结构的情况下,删除完整的数据。它是DDL(数据定义语言)或数据定义语言的一部分。 命令 . 通常,当我们想要从表格中删除全部数据而不删除表格结构时,我们使用这个命令。
TRUNCATE命令与DELETE命令的工作方式相同,都不使用 WHERE子句 来从表格中删除完整的行。然而,TRUNCATE命令比DELETE命令更高效,因为它删除并重新创建表格,而不是逐个删除单个记录。由于这个命令在内部删除并重新创建表格,所以受truncate语句影响的行数为零,而delete语句会返回被删除的行数。
执行此命令时,它不会保持事务日志。它释放数据 页而不是行 并在事务日志中为释放页记入条目。此命令还锁定页面而不是行;因此,它需要更少的锁和资源。
在使用TRUNCATE命令时必须考虑以下几点:
- 我们不能在此命令中使用 WHERE子句 ,因此无法对记录进行过滤。
- 执行此命令后,我们 无法回滚已删除的数据 ,因为在执行此操作时不会保存日志。
- 当表格被 外键 引用或参与 索引视图 时,不能使用truncate语句。
- TRUNCATE命令不会触发与被截断的表格相关的DELETE 触发器 ,因为它不处理单个行。
语法
以下语法解释了使用TRUNCATE命令从表格中删除数据的方式:
TRUNCATE [TABLE] table_name;
在此语法中,首先,我们将指定要删除的表名和要删除的数据。语法中的TABLE关键字不是强制性的。但是,最好使用它来区分 TRUNCATE() 函数和 TRUNCATE TABLE语句 。
MySQL截断表示例
让我们用一个例子来演示如何使用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语法截断customer表的以下语句:
mysql> TRUNCATE TABLE customer;
执行成功后,我们会得到以下输出:
正如我们所看到的,即使将表中的所有记录删除,该查询仍然返回 0 行受影响 我们可以通过再次执行SELECT语句来验证数据的删除。该命令给出以下输出,显示表中没有记录:
如何截断带有外键的表?
如果我们对使用外键约束的表执行截断操作,将会出现以下错误:
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;
如何在MySQL中截断所有表?
MySQL中的TRUNCATE语句每次只能删除一个表。如果我们想删除多个表,就需要执行单独的TRUNCATE语句。下面的示例展示了如何在MySQL中截断多个表:
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';