MySQL的delete和drop以及不常见的truncate的异同分析
首先说一下delete和drop,这两个命令是常用的删除命令,在MySQL中,删除数据库还是删除表,或者删除表内字段,删除用户,都是有广泛的使用,但drop命令使用更为广泛,并且删除更为彻底。
删除数据库: 这个没什么好说的,只有drop命令, drop database 数据库名称,通常加 if exists,也就是
drop database if exists 数据库名;
删除表:drop table if exists 数据库名.表名; 这个命令执行后表也被删除,但可以回滚操作恢复表。
truncate table if exists 数据库名.表名; 这个命令执行后表仍然在,表的内容被删除清空了。该操作后无法恢复数据
有drop命令和truncate命令。
删除用户:假设建立了用户WordPress,现在要删除它。命令如下:
CREATE USER 'wordpress'@'localhost' IDENTIFIED BY '密码';
CREATE USER 'wordpress'@'%' IDENTIFIED BY 'shiGuang_32';
当然了,通常我们建立完用户后,都是有用处的,会赋予各种权限以使用用户,对吧。假设赋权 select 所有库。
GRANT select ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY '密码';
DROP USER if exists wordpress@'localhost';
DROP USER if exists wordpress@'%';
drop删除用户就是彻底删除了,即使你在建立同名用户wordpress,也需要重新赋权。
DELETE FROM USER WHERE HOST='localhost' AND USER='wordpress';
DELETE FROM USER WHERE HOST='%' AND USER='wordpress';
这个方式删除用户后,在建立相同用户wordpress,不需要重新赋权,以往的赋权 权力仍然在、本例中不需要再次赋予select。
总结:
1.drop删除掉的用户不仅将user表中的数据删除,还会删除诸如db和其他权限表的内容。而(方法二)只是删除了user表的内容,其他表不会被删除,后期如果命名一个和已删除用户相同的名字,权限就会被继承。
2.当你不再需要该表时, 用 drop;当你仍要保留该表,但要删除所有记录时, 用 truncate;当你要删除部分记录或者有可能会后悔的话, 用 delete。truncate只能整张表删除,表字段无法删除,自然,没有配合where语句的情况。
3.truncate 相当于保留原mysql表的结果,重新创建了这个表,所有的状态都相当于新的,索引都重新生成了。而delete的效果相当于一行行删除,所以可以rollback也就是回滚,恢复后索引扔保留原来的;
4.效率上 truncate 比 delete快,而且 truncate 删除后将重建索引(新插入数据后id从0开始记起),而 delete不会删除索引 (新插入的数据将在删除数据的索引后继续增加)
5.delete 操作后返回删除的记录数,而 truncate 返回的是0或者-1(成功则返回0,失败返回-1);