TRUNCATE

说明

清空一个表

语法

truncate ::=

参数

table_name

要清空的表。

RESTART IDENTITY

截断表时重置标识列(序列、自增列)

CONTINUE IDENTITY

截断表时不重置标识列(序列、自增列)

RESTRICT

默认选项,确保只有不存在外键引用的表的数据才可以被删除.

CASCADE

任何引用的外键表的数据都将被删除。

注解

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快。

不能在事务块(BEGIN/COMMIT 对) 里执行 TRUNCATE,因为TRUNCATE操作不记录日志,无法回退。

对临时表执行TRUNCATE操作时将删除临时表在该会话上的实例,解除临时表与该会话的绑定。

有CASCADE标识存在时,将级联删除所有引用的外键表和这些外键表引用的外键表的所有数据。请慎用。

数据库后台配置参数 TRUNCATE_RESTART_IDENTITY 用于控制 TRUNCATE 语句处理标识列(序列、自增列)的默认方式。 当参数值为 TRUE 时,TRUNCATE ... 语句相当于 TRUNCATE ... RESTART IDENTITY。 当参数值为 FALSE 时,TRUNCATE ... 语句相当于 TRUNCATE ... CONTINUE IDENTITY。 如果指定了 RESTART IDENTITY 或者 CONTINUE IDENTITY,配置参数 TRUNCATE_RESTART_IDENTITY 不起作用。

示例

示例1: 截断表

--  清理环境
DROP TABLE tab1 CASCADE;

--  创建表并插入数据
CREATE TABLE tab1(a INT, b INT);

INSERT INTO tab1 VALUES(1, 1);
INSERT INTO tab1 VALUES(2, 221);
INSERT INTO tab1 VALUES(3, 223);


SELECT * FROM tab1 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |1           |
------------------------
2           |221         |
------------------------
3           |223         |
总数目:3


--  截断表
TRUNCATE TABLE tab1;


SELECT * FROM tab1 ORDER BY a;
A(int)      |B(int)      |
总数目:0


--  删除表
DROP TABLE tab1;

示例2: 级联截断表

--三个循环引用外键时执行TRUNCATE CASCADE
--建立表结构
drop table t2 cascade;
drop table t1 cascade;
drop table t3 cascade;
create table t1(a int primary key,b int);
create table t2( a int primary key,b int, CONSTRAINT fk_column FOREIGN KEY  (a) REFERENCES t1(a));
create table t3( a int primary key,b int, CONSTRAINT fk_column FOREIGN KEY  (a) REFERENCES t2(a));

--构建测试数据
insert into  t1 values(1,2);
insert into  t1 values(2,2);
insert into  t2 values(2,2);
insert into  t2 values(1,1);
insert into  t3 values(2,2);
insert into  t3 values(1,1);

--构建循环引用为外键的关系
alter table t1 add CONSTRAINT fk_column1 FOREIGN KEY  (b) REFERENCES t3(a);


--核查数据
select * from t1;
A(int)      |B(int)      |
------------------------
1           |2           |
------------------------
2           |2           |
总数目:2

select * from t2;
A(int)      |B(int)      |
------------------------
2           |2           |
------------------------
1           |1           |
总数目:2

select * from t3;
A(int)      |B(int)      |
------------------------
2           |2           |
------------------------
1           |1           |
总数目:2

--删除t1,t2,t3任何一个表都将导致所有引用的外键表数据被全部删除
truncate table t2 cascade;


--检查数据,都为空
select * from t1;
A(int)      |B(int)      |
总数目:0

select * from t2;
A(int)      |B(int)      |
总数目:0

select * from t3;
A(int)      |B(int)      |
总数目:0

--删除测试环境
drop table t2 cascade;
drop table t1 cascade;
drop table t3 cascade;

示例3: 指定 RESTART IDENTITY 截断表时重置标识列(序列、自增列)

--  清理环境
drop table t1;
 
--  创建带有标识列(序列、自增列)的表并插入数据
create table t1(a serial,b int auto_increment unique,c int);
 
insert into t1(c) values(1);
insert into t1(c) values(2);
insert into t1(c) values(3);


select * from t1 order by a;
A(int)      |B(int)      |C(int)      |
------------------------------------
1           |1           |1           |
------------------------------------
2           |2           |2           |
------------------------------------
3           |3           |3           |
总数目:3

--  指定 RESTART IDENTITY 截断表
truncate t1 restart identity;
 
--  再次插入数据
insert into t1(c) values(4);
insert into t1(c) values(5);
insert into t1(c) values(6); 


--  标识列(序列、自增列)被重置
select * from t1 order by a;
A(int)      |B(int)      |C(int)      |
------------------------------------
1           |1           |4           |
------------------------------------
2           |2           |5           |
------------------------------------
3           |3           |6           |
总数目:3

--  删除测试环境
drop table t1;

示例4: 指定 CONTINUE IDENTITY 截断表时不重置标识列(序列、自增列)

--  清理环境
drop table t1;
 
--  创建带有标识列(序列、自增列)的表并插入数据
create table t1(a serial,b int auto_increment unique,c int);
insert into t1(c) values(1);
insert into t1(c) values(2);
insert into t1(c) values(3);


select * from t1 order by a;
A(int)      |B(int)      |C(int)      |
------------------------------------
1           |1           |1           |
------------------------------------
2           |2           |2           |
------------------------------------
3           |3           |3           |
总数目:3

--  指定 CONTINUE IDENTITY 截断表
truncate t1 continue identity;
 
--  再次插入数据
insert into t1(c) values(4);
insert into t1(c) values(5);
insert into t1(c) values(6); 


--  标识列(序列、自增列)未被重置
select * from t1 order by a;
A(int)      |B(int)      |C(int)      |
------------------------------------
4           |4           |4           |
------------------------------------
5           |5           |5           |
------------------------------------
6           |6           |6           |
总数目:3
 
--  删除测试环境
drop table t1;

示例5: 当后台配置参数 TRUNCATE_RESTART_IDENTITY 值为 FALSE 时,若不指定 RESTART IDENTITY 和 CONTINUE IDENTITY,则截断表时不会重置标识列(序列、自增列)

--  查看配置参数
show TRUNCATE_RESTART_IDENTITY;
name(text)      |setting(text)      |
-----------------------------------
TRUNCATE_RESTART|FALSE              |
_IDENTITY       |                   |
总数目:1

--  清理环境
drop table t1;
 
--  创建带有标识列(序列、自增列)的表并插入数据
create table t1(a serial,b int auto_increment unique,c int);
insert into t1(c) values(1);
insert into t1(c) values(2);
insert into t1(c) values(3);


select * from t1 order by a;
A(int)      |B(int)      |C(int)      |
------------------------------------
1           |1           |1           |
------------------------------------
2           |2           |2           |
------------------------------------
3           |3           |3           |
总数目:3

--  不指定 RESTART IDENTITY 或 CONTINUE IDENTITY 截断表
truncate t1;
 
--  再次插入数据
insert into t1(c) values(4);
insert into t1(c) values(5);
insert into t1(c) values(6); 


--  标识列(序列、自增列)未被重置
select * from t1 order by a;
A(int)      |B(int)      |C(int)      |
------------------------------------
4           |4           |4           |
------------------------------------
5           |5           |5           |
------------------------------------
6           |6           |6           |
总数目:3
 
--  删除测试环境
drop table t1;

示例6: 当后台配置参数 TRUNCATE_RESTART_IDENTITY 值为 TRUE 时,若不指定 RESTART IDENTITY 和 CONTINUE IDENTITY,则截断表时会重置标识列(序列、自增列)

--  开启配置参数
set TRUNCATE_RESTART_IDENTITY = TRUE;

--  查看配置参数
show TRUNCATE_RESTART_IDENTITY;
name(text)      |setting(text)      |
-----------------------------------
TRUNCATE_RESTART|TRUE               |
_IDENTITY       |                   |
总数目:1

--  清理环境
drop table t1;
 
--  创建带有标识列(序列、自增列)的表并插入数据
create table t1(a serial,b int auto_increment unique,c int);
insert into t1(c) values(1);
insert into t1(c) values(2);
insert into t1(c) values(3);


select * from t1 order by a;
A(int)      |B(int)      |C(int)      |
------------------------------------
1           |1           |1           |
------------------------------------
2           |2           |2           |
------------------------------------
3           |3           |3           |
总数目:3

--  不指定 RESTART IDENTITY 或 CONTINUE IDENTITY 截断表
truncate t1;
 
--  再次插入数据
insert into t1(c) values(4);
insert into t1(c) values(5);
insert into t1(c) values(6); 


--  标识列(序列、自增列)被重置
select * from t1 order by a;
A(int)      |B(int)      |C(int)      |
------------------------------------
1           |1           |4           |
------------------------------------
2           |2           |5           |
------------------------------------
3           |3           |6           |
总数目:3
 
--  删除测试环境
drop table t1;

--  关闭配置参数
reset TRUNCATE_RESTART_IDENTITY;