删除vs截断
Drop和Truncate是数据库管理系统中使用的两个SQL(结构化查询语言)语句,我们希望从数据库中删除数据记录。Drop和Truncate语句都会删除表中的整个数据和相关的SQL语句。在这种情况下,Delete操作无效,因为它比Drop和Truncate占用更多的存储空间。
如果我们想放弃数据库中的一个表及其所有数据,SQL允许我们使用Drop语句轻松地执行此操作。Drop命令是一个DDL(数据定义语言)命令,可用于销毁现有的数据库、表、索引或视图。它从数据库中删除表中的全部信息以及表结构。另外,我们可能希望简单地删除表中的所有数据,但是没有表,在这种情况下,我们可以在SQL中使用Truncate语句。Truncate也是一个DDL命令,它消除了表中的所有行,但保留了相同的表定义以供将来使用。
Drop命令
如前所述,Drop命令删除表定义及其所有数据、完整性约束、索引、触发器和访问特权,这些都是在特定表上创建的。因此,它会从数据库中完全删除现有对象,并且在执行命令后,与其他表的关系也将不再有效。它还从数据字典中删除有关表的所有信息。下面是对表使用Drop语句的典型语法。
删除表格<;表格名称>;
我们只需替换上面Drop命令示例中要从数据库中删除的表名。
必须指出的是,Drop语句不能用于删除已被外键约束引用的表。在这种情况下,必须首先删除引用外键约束或该特定表。此外,Drop语句不能应用于数据库中的系统表。
由于Drop命令是一个auto commit语句,一旦触发操作就不能回滚,也不会触发触发器。当删除一个表时,对该表的所有引用都将无效,因此,如果我们想再次使用该表,则必须使用所有完整性约束和访问权限重新创建该表。所有与其他表的关系,也必须重新定位。
截断命令
Truncate命令是一个DDL命令,它删除表中的所有行而不使用任何用户指定的条件,并释放表使用的空间,但表结构及其列、索引和约束保持不变。Truncate通过取消分配用于存储表数据的数据页来消除表中的数据,并且只有这些页释放保留在事务日志中。因此,与Delete等其他相关SQL命令相比,它使用的事务日志资源和系统资源更少。所以Truncate语句比其他语句快一点。以下是Truncate命令的典型语法。
截断表格<;表格名称>;
我们应该用上面的语法替换要从中删除整个数据的表名。
不能对已被外键约束引用的表使用Truncate。它在操作之前自动使用一个提交,然后再使用另一个提交,所以事务的回滚是不可能的,并且不会触发触发器。如果我们想重用表,我们只需要访问数据库中现有的表定义。
Drop和Truncate有什么区别?
Drop和Truncate命令都是DDL命令,也是自动提交语句,因此无法回滚使用这些命令执行的事务。
Drop和Truncate之间的主要区别是Drop命令不仅删除表中的所有数据,而且还会从数据库中永久删除包含所有引用的表结构,而Truncate命令只删除表中的所有行,并保留表结构及其引用。
如果删除一个表,与其他表的关系将不再有效,并且完整性约束和访问权限也将被删除。因此,如果需要重用表,则必须使用关系、完整性约束以及访问权限来重新构建表。但是,如果表被截断,表结构及其约束将保留以备将来使用,因此,重用时不需要上述任何重新创建。