TRUNCATE 函数
说明
TRUNCATE(X, D) 函数是 MySQL 自带的一个系统函数。其中 X 是数值,而 D 是保留小数的位数。其作用就是按照小数位数,进行数值截取(此处的截取是按保留位数直接进行截取,没有四舍五入)。
规则
规则如下:
- 当
D大于0,是对数值X的小数位数进行操作。 - 当
D等于0,是将数值X的小数部分去除,只保留整数部分。 - 当
D小于0,是将数值X的小数部分去除,并将整数部分按照D指定位数,用0替换。
示例
X为正数1
2
3
4
5
6
7SELECT TRUNCATE(123.4567, 3); # 123.456
SELECT TRUNCATE(123.4567, 2); # 123.45
SELECT TRUNCATE(123.4567, 1); # 123.4
SELECT TRUNCATE(123.4567, 0); # 123
SELECT TRUNCATE(123.4567, -1); # 120
SELECT TRUNCATE(123.4567, -2); # 100
SELECT TRUNCATE(123.4567, -3); # 0X为负数1
2
3
4
5
6
7SELECT TRUNCATE(-123.4567, 3); # -123.456
SELECT TRUNCATE(-123.4567, 2); # -123.45
SELECT TRUNCATE(-123.4567, 1); # -123.4
SELECT TRUNCATE(-123.4567, 0); # -123
SELECT TRUNCATE(-123.4567, -1); # -120
SELECT TRUNCATE(-123.4567, -2); # -100
SELECT TRUNCATE(-123.4567, -3); # 0其他示例
1
2
3
4
5
6
7
8
9
10
11// 查询数据库的所有表的容量和索引数
SELECT
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)',
sum(truncate(DATA_FREE/1024/1024, 2)) as '碎片占用(MB)'
from information_schema.tables
where table_schema='kalacloud_test_data'
group by table_schema and table_name='product_demo'
order by sum(data_length) desc, sum(index_length) desc;
truncate 命令
说明
truncate 的作用是清空表,只能作用于表。执行 truncate 语句需要 drop 权限,从逻辑上讲,truncate table 类似于 delete 删除所有行的语句或 drop table 然后再 create table 语句的组合。
其中为了实现高性能,它绕过了删除数据的 DML 方法,因此不支持回滚。尽管 truncate table 与 delete 类似,但是他被分类为 DDL 语句而不是 DML 语句。
区别
truncate和drop都是DDL语句,执行后无法回滚,而delete是可以回滚的。truncate是直接删除原表然后再创建一个一样的表,执行速度比delete快,而delete则是一行一行的删除记录。truncate不支持使用WHERE子句,只能删除全部整体,而delete支持WHERE子句,通过执行条件来删除部分数据。truncate语句只能用于表,而drop和delete可以作用于视图、表等。truncate会清除表中所有的行,但表结构及其约束、索引保持不变,但drop会删除表的结构及其所依赖的约束和索引。truncate会重置表的自增值,delete不会。truncate不会激活与表有关的删除触发器,但delete可以。truncate使用后会使表和索引所占的空间恢复到初始大小,delete操作不会减少表或索引所占用的空间,drop语句则会将表所占用的空间全部释放。
使用
其语法格式如下:
1 | TRUNCATE TABLE table_name; |
注意事项
- 如果想删除部分数据用
delete再带上WHERE子句;如果想删除表就需要使用drop;如果想保留表而将所有数据删除且和事务无关那就用truncate即可。 - 如果和事务有关或者想触发
trigger可以用delete;如果想整理表内部的碎片可以用truncate然后再重新插入数据。 truncate无法通过binlog回滚。truncate会清空所有数据且执行速度很快。truncate不能对有外键约束引用的表使用。- 执行
truncate需要drop权限,不建议给账号drop权限。 - 执行
truncate前一定要再三检查确认,最好提前备份下表数据。
引用
个人备注
此博客内容均为作者学习所做笔记,侵删!
若转作其他用途,请注明来源!