结构化查询语言/TRUNCATE
外观
< 结构化查询语言
TRUNCATE TABLE 命令删除表中的所有行,不会触发任何操作。与 DELETE 命令不同,它不包含 WHERE 子句来指定单个行。
关于 TRUNCATE TABLE 命令,大多数 DBMS 表现出比 DELETE 命令明显更好的性能。这是因为 DBMS 可以清空整个表(及其索引),而无需访问单个行。
- 根据定义,没有 WHERE 子句。
- 根据定义,不会启动任何触发操作。
- 事务锁定整个表。
- 如果存在从表 t1 到 t2 的外键约束,则命令
'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;
示例数据库的原始数据可以如示例数据库数据页面所示重建。