我可以获得要验证可用空间的所有列的列表。
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
答案 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 整数列,而不仅仅是自动递增主键。但这与其他专栏文章无关。