### 15.11.5 使用 TRUNCATE TABLE 回收磁盘空间

回收操作系统磁盘空间时[截断](glossary.html#glos_truncate)一个`InnoDB`表，表必须存储在自己的[.ibd](glossary.html#glos_ibd_file)文件。对于要存储在自己的表[.ibd](glossary.html#glos_ibd_file)文件，[`innodb_file_per_table`](innodb-parameters.html#sysvar_innodb_file_per_table)必须在创建表时启用。此外，不能有[外键](glossary.html#glos_foreign_key)被截断的表和其他表之间的约束，否则`截断表`操作失败。但是，允许在同一个表中的两列之间存在外键约束。

当一个表被截断时，它会被删除并在一个新的`.ibd`文件，释放的空间返回给操作系统。这与截断相反`InnoDB`存储在`InnoDB` [系统表空间](glossary.html#glos_system_tablespace)（表创建时`innodb_file_per_table=OFF`) 和存储在共享中的表[通用表空间](glossary.html#glos_general_tablespace), 只有`InnoDB`可以在表被截断后使用释放的空间。

截断表并将磁盘空间返回给操作系统的能力也意味着[物理备份](glossary.html#glos_physical_backup)可以更小。截断存储在系统表空间中的表（在`innodb_file_per_table=OFF`) 或在一般表空间中会在表空间中留下未使用的空间块。
