Mysql
 sql >> Base de données >  >> RDS >> Mysql

Trouver toutes les colonnes entières qui atteignent ses limites en utilisant information_schema

J'ai écrit une solution pour cette tâche, mais je ne suis pas la seule personne à avoir fait quelque chose comme ça.

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

Cette requête est codée en dur pour le test schéma, vous devez donc le modifier pour votre propre schéma.

La réponse courte à la question "est-ce que ma clé primaire va déborder?" est simplement de le modifier en BIGINT UNSIGNED à présent. Cela durera sûrement jusqu'à l'effondrement de la civilisation.

Dans le même référentiel git, j'ai un autre script similaire pour vérifier tous des colonnes d'entiers, pas seulement des clés primaires à incrémentation automatique. Mais ce n'est pas aussi préoccupant pour les autres colonnes.