TRUNCATE 语句 会删除一个特定表的所有数据。

Note TRUNCATE删除一张表的过程是,通过drop表删除数据,然后创建一张表结构一样的新表。对于大表而言,TRUNCATE的性能是比一行行删除的性能好的。但是,对于小表而言, 不带WHERE子句的DELETE会更快。

概要

图片

所需权限

必须拥有操作表的 DROP privilege

参数

Parameter Description
table_name 要truncate的表的名字
CASCADE 对要truncated表的有Foreign Key依赖的所有表都会被truncate。

CASCADE不会列出被truncate的表,因此使用需谨慎。
RESTRICT (Default) 如果要truncate的表有Foreign Key依赖,则truncate表会失败。

例子

Truncate 一张表(没有外键依赖)

> SELECT * FROM t1;
+----+------+
| id | name |
+----+------+
|  1 | foo  |
|  2 | bar  |
+----+------+
(2 rows)
> TRUNCATE t1;

> SELECT * FROM t1;
+----+------+
| id | name |
+----+------+
+----+------+
(0 rows)

Truncate 一张表和要依赖的表

在这个例子中,表orders对表 customers有个外键依赖。因此,在使用CASCADE值后,在truncate表customers时们也会truncate表orders

使用 CASCADETruncate有依赖的表

Note: 对于一张要truncate的表,CASCADE会truncate所有对这样表有依赖的表,而且不会列出已经truncate的表,这可能会导致一些难以恢复的损失。所以为了避免潜在的损失,最好显式地truncate每一张表。更多相关消息,请看Truncate Dependent Tables Explicitly

> TRUNCATE customers;
pq: "customers" is referenced by foreign key from table "orders"
> TRUNCATE customers CASCADE;

> SELECT * FROM customers;
+----+-------+
| id | email |
+----+-------+
+----+-------+
(0 rows)
> SELECT * FROM orders;
+----+----------+------------+
| id | customer | orderTotal |
+----+----------+------------+
+----+----------+------------+
(0 rows)

显式truncate有依赖的表

> TRUNCATE customers, orders;

> SELECT * FROM customers;
+----+-------+
| id | email |
+----+-------+
+----+-------+
(0 rows)
> SELECT * FROM orders;
+----+----------+------------+
| id | customer | orderTotal |
+----+----------+------------+
+----+----------+------------+
(0 rows)

See Also