SQLTruncateTable实例讲解
在本教程中,我们来学习如何使⽤SQL TRUNCATE TABLE语句⾼效,快速地删除表中的所有数据。
(更多教程请访问)
1. SQL TRUNCATE TABLE语句简介
要删除表中的所有数据,可使⽤不带WHERE⼦句的DELETE语句。但是对于具有⼏百万⾏的⼤表,DELETE语句很慢且效率不⾼。
要快速删除⼤表中的所有⾏,使⽤以下TRUNCATE TABLE语句:
TRUNCATE TABLE table_name;
在此语法中,指定要在TRUNCATE TABLE⼦句后删除数据的table_name。
某些数据库系统(如MySQL和PostgreSQL)允许直接省略TABLE关键字,因此TRUNCATE TABLE语句如下所⽰:
TRUNCATE table_name;
发出TRUNCATE TABLE语句时,数据库系统通过取消分配表分配的数据页来删除表中的所有⾏。通过这样做,RDBMS可以减少⽇志记录的资源和需要获取的锁的数量。
如果要⼀次截断多个表,可以在TRUNCATE TABLE⼦句后使⽤逗号分隔的表名列表,如下所⽰:
TRUNCATE TABLE table_name1, table_name2, ...;
并⾮所有数据库系统都⽀持这种使⽤TRUNCATE TABLE语句来⼀次删除多个表。如果不使⽤,则要发出多个TRUNCATE TABLE语句来截断多个表。
2. SQL TRUNCATE TABLE与DELETE
逻辑上,TRUNCATE TABLE语句和不带WHERE⼦句的DELETE语句提供了从表中删除所有数据的相同效果。但是,它们确实存在⼀些差别:
使⽤DELETE语句时,数据库系统会记录操作。通过⼀些努⼒,可以回滚已删除的数据。但是,当使⽤TRUNCATE TABLE语句时,除⾮在尚未提交的事务中使⽤它,否则⽆法回滚。
要从外键约束引⽤的表中删除数据,不能使⽤TRUNCATE TABLE语句。在这种情况下,必须使⽤DELETE语句。
如果表具有与之关联的触发器,则TRUNCATE TABLE语句不会触发delete触发器。
执⾏TRUNCATE TABLE语句后,某些数据库系统会将⾃动增量列(或标识,序列等)的值重置为其起始值。DELETE语句不是这种情况。
带有WHERE⼦句的DELETE语句从表中删除部分数据,⽽TRUNCATE TABLE语句始终从表中删除所有数据。
3. SQL TRUNCATE TABLE⽰例
下⾯我们来看⼀个截断表的例⼦。
⾸先,创建⼀个名为big_table的新表,如下所⽰:
CREATE TABLE big_table (
id INT AUTO_INCREMENT PRIMARY KEY,
val INT
);
其次,如果要将样本数据插⼊big_table表,请多次执⾏以下语句:
INSERT INTO big_table (val)
VALUES
(RAND(100000));
请注意,如果使⽤⽀持存储过程的数据库系统,则可以将此语句放在循环中。例如,MySQL中的以下将数据加载到big_table表中,其中包
含num参数指定的⾏数。
DELIMITER $$
CREATE PROCEDURE load_big_table_data(IN num int)
BEGIN
DECLARE counter int default 0;
WHILE counter < num DO
truncated 带where
INSERT INTO big_table(val)
VALUES(RAND(1000000));
END WHILE;
END$$
以下语句调⽤load_big_table_data存储过程将999999⾏数据插⼊到big_table表。
CALL load_big_table_data(999999)
第三,要删除big_table中所有数据,请使⽤以下语句:
TRUNCATE TABLE big_table;
如上所见,TRUNCATE TABLE语句的速度有多快。
现在我们已经学习了如何使⽤TRUNCATE TABLE语句来快速删除⼤表中的所有数据,并理解TRUNCATE TABLE和DELETE语句之间的差异。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。