跳转至内容

结构化查询语言/TRUNCATE

来自维基教科书,自由的教科书



TRUNCATE TABLE 命令删除表中的所有行,不会触发任何操作。与 DELETE 命令不同,它不包含 WHERE 子句来指定单个行。

关于 TRUNCATE TABLE 命令,大多数 DBMS 表现出比 DELETE 命令明显更好的性能。这是因为 DBMS 可以清空整个表(及其索引),而无需访问单个行。

  • 根据定义,没有 WHERE 子句。
  • 根据定义,不会启动任何触发操作。
  • 事务锁定整个表。
  • 如果存在从表 t1t2外键约束,则命令 'TRUNCATE TABLE t2' 将失败。这与 t1 中的任何行是否实际引用 t2 中的任何行无关。DBMS 只检查 Forgeign-Key-constraint 定义的存在性。


TRUNCATE TABLE 命令的语法非常简单。

TRUNCATE TABLE <tablename>;
-- Delete ALL rows of the table 'myTable'
TRUNCATE TABLE myTable;
-- In most DBMS ROLLBACK is not possible - in opposite to situations with a DELETE command.

一个类比

[编辑 | 编辑源代码]

为了说明 TRUNCATE TABLE 命令和 DELETE 命令(不带 WHERE 子句)之间的区别,可以想象一个卡车司机,他想要清空一个装满沙子的拖车到一个建筑工地。为此,他有两种选择:要么倾斜拖车来清空它——这对应于 TRUNCATE TABLE 命令——,要么爬上拖车,一次一粒地扔下沙子——这对应于 DELETE 命令。

使用 DELETE 命令删除表 'person_hobby' 中的所有行。
验证 'person_hobby' 中是否没有剩余的行。
使用 TRUNCATE TABLE 命令删除表 'hobby' 中的所有行。
会发生什么?(考虑到表 'person_hobby' 到 'hobby' 有一个 FK 约束。)

点击查看解决方案
-- Delete all rows of 'person_hobby' with a DELETE command
DELETE FROM person_hobby;
COMMIT;

-- Are there any rows?
SELECT count(*) FROM person_hobby;

-- Try TRUNCATE TABLE command:
TRUNCATE TABLE hobby;
-- An exception will be thrown. Although there is no row in 'person_hobby' referring a row in 'hobby',
-- the definition of the Foreign Key constraint exists. This is the reason for the exception.

如果将上面的示例中 TRUNCATE TABLE 命令替换为 DELETE 命令,会发生什么?

点击查看解决方案
-- As there is no row in 'person_hobby' referring to 'hobby', the DELETE command deletes all rows in 'hobby'.
DELETE FROM hobby;
COMMIT;

示例数据库的原始数据可以如示例数据库数据页面所示重建。


华夏公益教科书