嘿,伙计们,我正在使用这个查询来获得使用自动增量的表的最大值。

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

有什么想法吗?是吗?

最佳答案

>>运算符是按位右移。
例如,INT UNSIGNED的最大值为4294967295,在基2中为232-1或11111111111111111111111111111111。
但有符号INT使用其中一个位作为符号位,因此有符号整数的最大值是2147483647,即231-1,或基2中的0111111111111111111111111111111。
将11111111111111111111111111转换为0111111111111111111111111111可以通过1位的右移位来完成。32位单词的最左端用零填充。
现在对于IF:mysql将数据类型命名为“int”或“int unsigned”。因此,如果字符串函数LOCATE()找到“unsigned”一词,那么最大值是4294967295的整个范围,因此位将其移动0位。否则“unsigned”不会出现在数据类型名中,并且int是有符号的,因此位将其移动1位。
另一种说法是:
最大值INT UNSIGNED=4294967295=11111111111111111111111111
最大值=2147483647=0111111111111111111111111=4294967295>>1
你也可能对我写的类似剧本感兴趣:https://github.com/billkarwin/bk-tools/blob/master/pk-full-ratio.sql

关于mysql - MySQL查询使用自动增量获取表的最大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20341190/

10-13 05:34