Mysql Query使用自动增量获取表的最大值

时间:2013-12-03 01:32:17

标签: mysql sql linux bash shell

嘿伙计我正在使用此查询来获取使用自动增量的表的最大值

SELECT table_schema,
   table_name,
   data_type,
   ( 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
FROM   information_schema.columns
WHERE  table_schema NOT IN ( 'MYSQL', 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA'
                       )
   AND extra = 'auto_increment'"

我很难理解IF声明正在做什么。

end >> IF(Locate('unsigned', column_type) > 0, 0, 1) ) AS MAX_VALUE

任何想法??

3 个答案:

答案 0 :(得分:1)

>>运算符是按位右移。

例如,INT UNSIGNED的最大值为4294967295,其中2 32 -1,或者基数2中的11111111111111111111111111111111。

但签名INT使用其中一个位作为符号位,因此有符号整数的最大值为2147483647,其中2 31 -1或011111111111111111111111111111111 in base 2。

将11111111111111111111111111111111转换为011111111111111111111111111111111可以通过1位右移来完成。 32位字的最左位用零填充。

现在对于IF:MySQL将数据类型命名为“int”或“int unsigned”。因此,如果字符串函数LOCATE()找到“unsigned”字样,则最大值为4294967295的整个范围,因此将其位移0位。否则“unsigned”不会出现在数据类型名称中,并且int是有符号的,所以将它按位移位1位。

说明这一点的另一种方式:

  • Max INT UNSIGNED = 4294967295 = 11111111111111111111111111111111
  • Max INT = 2147483647 = 011111111111111111111111111111111 = 4294967295>> 1

您可能也对我写的类似脚本感兴趣:https://github.com/billkarwin/bk-tools/blob/master/pk-full-ratio.sql

答案 1 :(得分:0)

双尖括号(大于符号)是二元移位算子。例如,如果列类型是无符号整数,它将移位1个位置(这基本上是数字的正方形),如果它是常规有符号整数,则它根本不会移位。有符号整数使用一位来指示是正数还是负数。无符号整数使用该位作为值的一部分,因此它可以保持更高的最大值,但根本不能保持负值。有意义吗?

答案 2 :(得分:0)

运行'Locate('unsigned',column_type)函数。这将检查字符串“unsigned”是否出现在名为“column_type”的列中。 'locate'函数将返回'unsigned'中第一个字母的字符偏移/位置(如果在'column_type'中找到)或零(0)(如果未找到)。测试该结果大于零'> 0' 。如果为TRUE,则返回下一个表达式,在上述情况下为零(0)。如果为FALSE,则返回最终表达式,为一(1)。

在其他语言中,可能会这样写:

if( Lotate('unsigned', column_type) > 0 ) {
    return 0;
} else {
    return 1;
}