Darn! This means oak-show-limits becomes redundant. Am I not supposed to speak about it on my coming presentation? Bad timing!
You have AUTO_INCREMENT columns. How far are you pushing the limits? Are you going to run out of AUTO_INCREMENT values soon? Perhaps you wonder whether you should ALTER from INT to BIGINT?
The answer is all there in INFORMATION_SCHEMA. The TABLES table shows the current AUTO_INCREMENT value per table, and the COLUMNS table tells us all about a column’s data type.
It takes some ugly code to deduce the maximum value per column type, what with signed/unsigned and data type, but then its very simple. Here is the query:
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_TYPE, IF( LOCATE('unsigned', COLUMN_TYPE) > 0, 1, 0 ) AS IS_UNSIGNED, ( CASE DATA_TYPE WHEN 'tinyint' THEN 255 WHEN 'smallint' THEN 65535 WHEN 'mediumint' THEN 16777215 WHEN 'int' THEN 4294967295 WHEN 'bigint' THEN 18446744073709551615 END >> IF(LOCATE('unsigned', COLUMN_TYPE) > 0, 0, 1) ) AS MAX_VALUE, AUTO_INCREMENT, AUTO_INCREMENT / ( CASE DATA_TYPE WHEN 'tinyint' THEN 255 WHEN 'smallint' THEN 65535 WHEN 'mediumint' THEN 16777215 WHEN 'int' THEN 4294967295 WHEN 'bigint' THEN 18446744073709551615 END >> IF(LOCATE('unsigned', COLUMN_TYPE) > 0, 0, 1) ) AS AUTO_INCREMENT_RATIO FROM INFORMATION_SCHEMA.COLUMNS INNER JOIN INFORMATION_SCHEMA.TABLES USING (TABLE_SCHEMA, TABLE_NAME) WHERE TABLE_SCHEMA NOT IN ('mysql', 'INFORMATION_SCHEMA', 'performance_schema') AND EXTRA='auto_increment' ;
There’s one row in the result set for each AUTO_INCREMENT column. since at most one AUTO_INCREMENT column can exist for any given table, each row also identifies a unique table. Resulting columns are mostly self-explanatory, but here’s some details on some of the columns:
- IS_UNSIGNED: 1 when the column is UNSIGNED, 0 otherwise.
- MAX_VALUE: maximum value that can be contained within column.
- AUTO_INCREMENT: current AUTO_INCREMENT value for table.
- AUTO_INCREMENT_RATIO: value in the range [0..1], where 1 means “100% full”.
A sample output:
+--------------+------------+--------------+-----------+-----------------------+-------------+------------+----------------+----------------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | DATA_TYPE | COLUMN_TYPE | IS_UNSIGNED | MAX_VALUE | AUTO_INCREMENT | AUTO_INCREMENT_RATIO | +--------------+------------+--------------+-----------+-----------------------+-------------+------------+----------------+----------------------+ | sakila | actor | actor_id | smallint | smallint(5) unsigned | 1 | 65535 | 201 | 0.0031 | | sakila | address | address_id | smallint | smallint(5) unsigned | 1 | 65535 | 606 | 0.0092 | | sakila | category | category_id | tinyint | tinyint(3) unsigned | 1 | 255 | 17 | 0.0667 | | sakila | city | city_id | smallint | smallint(5) unsigned | 1 | 65535 | 601 | 0.0092 | | sakila | country | country_id | smallint | smallint(5) unsigned | 1 | 65535 | 110 | 0.0017 | | sakila | customer | customer_id | smallint | smallint(5) unsigned | 1 | 65535 | 600 | 0.0092 | | sakila | film | film_id | smallint | smallint(5) unsigned | 1 | 65535 | 1001 | 0.0153 | | sakila | inventory | inventory_id | mediumint | mediumint(8) unsigned | 1 | 16777215 | 4582 | 0.0003 | | sakila | language | language_id | tinyint | tinyint(3) unsigned | 1 | 255 | 7 | 0.0275 | | sakila | payment | payment_id | smallint | smallint(5) unsigned | 1 | 65535 | 16050 | 0.2449 | | sakila | rental | rental_id | int | int(11) | 0 | 2147483647 | 16050 | 0.0000 | | sakila | staff | staff_id | tinyint | tinyint(3) unsigned | 1 | 255 | 3 | 0.0118 | | sakila | store | store_id | tinyint | tinyint(3) unsigned | 1 | 255 | 3 | 0.0118 | +--------------+------------+--------------+-----------+-----------------------+-------------+------------+----------------+----------------------+
Bonus: free advice on increasing your AUTO_INCREMENT capacity
Make it UNSIGNED. No, really. Check your definitions now.
11 thoughts on “Checking for AUTO_INCREMENT capacity with single query”