【问题标题】:Mysql Query to get max value of tables using auto incrementMysql查询使用自动增量获取表的最大值
【发布时间】:2013-12-03 01:32:16
【问题描述】:

大家好,我正在使用此查询来获取使用自动增量的表的最大值

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

有什么想法吗??

【问题讨论】:

    标签: mysql sql linux bash shell


    【解决方案1】:

    >> 运算符是按位右移。

    例如,INT UNSIGNED 的最大值为 4294967295,即 232-1,或 11111111111111111111111111111111(以 2 为底)。

    但有符号的INT 使用其中一个位作为符号位,因此有符号整数的最大值为 2147483647,即 231-1,或 011111111111111111111111111111111 以 2 为底。

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

    现在对于IF:MySQL 将数据类型命名为“int”或“int unsigned”。所以如果字符串函数LOCATE()找到了“unsigned”这个词,那么最大值就是4294967295的全范围,所以将其位移0位。否则数据类型名称中不出现“无符号”,而int是有符号的,所以位移1位。

    另一种说法:

    • 最大INT UNSIGNED = 4294967295 = 1111111111111111111111111111111
    • 最大INT = 2147483647 = 01111111111111111111111111111111 = 4294967295 >> 1

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2018-01-19
          • 2012-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-11
          • 2018-10-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多