Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Finden Sie mit information_schema alle Integer-Spalten, die an ihre Grenzen stoßen

Ich habe eine Lösung für diese Aufgabe geschrieben, aber ich bin kaum die einzige Person, die so etwas gemacht hat.

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

Diese Abfrage ist für den test fest codiert Schema, also müssen Sie es für Ihr eigenes Schema bearbeiten.

Die kurze Antwort auf die Frage "wird mein Primärschlüssel überlaufen?" ist, es einfach in BIGINT UNSIGNED zu ändern jetzt. Das wird sicherlich bis zum Zusammenbruch der Zivilisation dauern.

Im selben Git-Repo habe ich ein weiteres ähnliches Skript, um alle zu überprüfen Integer-Spalten, nicht nur Primärschlüssel mit automatischer Inkrementierung. Aber es ist nicht so wichtig für andere Spalten.