使用information_schema查找所有达到其极限的整数列

时间:2019-03-08 13:40:33

标签: mysql database-administration

我可以获得要验证可用空间的所有列的列表。

SELECT 
  TABLE_NAME, COLUMN_NAME, COLUMN_TYPE 
FROM 
  INFORMATION_SCHEMA.COLUMNS 
WHERE 
  COLUMN_TYPE = 'int(11)' AND 
  TABLE_NAME LIKE 'catalog_category_entity%';

考虑到int(11)最多为2147483648(不考虑无符号),我想从这个范围计算出我正在使用多少。

我个人可以这样检查:

select 
  max(value_id)/2147483648 as usage 
from 
  catalog_product_entity_int;

但是我想对第一个查询中找到的所有列都做一个很好的方法。

在这种情况下,我想知道递归CTE是否是正确的资源,以及如何做到这一点,或者是否有更优雅的检查方法。

我希望有一种不错的快速检查方法,而无需任何外部工具。

我已经找到了Postgres的解决方案,但是我想知道我是否真的需要该功能。 postgres: find all integer columns with its current max value in it

1 个答案:

答案 0 :(得分:1)

我为此任务写了一个解决方案,但我并不是唯一做过这样的事情的人。

select concat('`', table_schema, '`.`', table_name, '`.`', column_name, '`') as `column`,
  auto_increment as `current_int`, max_int, round((auto_increment/max_int)*100, 2) as `pct_max`
from (select table_schema, table_name, column_name, auto_increment,
  pow(2, case data_type
    when 'tinyint'   then 7
    when 'smallint'  then 15
    when 'mediumint' then 23
    when 'int'       then 31
    when 'bigint'    then 63
    end+(column_type like '% unsigned'))-1 as max_int
  from information_schema.tables t
  join information_schema.columns c using (table_schema,table_name)
  join information_schema.key_column_usage k using (table_schema,table_name,column_name)
  where t.table_schema in ('test')
    and k.constraint_name = 'PRIMARY'
    and k.ordinal_position = 1
    and t.auto_increment is not null
) as dt;

https://github.com/billkarwin/bk-tools/blob/master/pk-full-ratio.sql

该查询是针对test模式进行硬编码的,因此您需要针对自己的模式对其进行编辑。

“我的主键会溢出吗?”这个问题的简短答案。现在将其更改为BIGINT UNSIGNED。这肯定会一直持续到文明崩溃。

在同一个git repo中,我还有另一个类似的脚本来检查 all 整数列,而不仅仅是自动递增主键。但这与其他专栏文章无关。