嘿,伙计们,我正在使用这个查询来获得使用自动增量的表的最大值。
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/