簡體   English   中英

MySQL查詢使用自動增量獲取表的最大值

[英]Mysql Query to get max value of tables using auto increment

大家好,我正在使用此查詢來獲取使用自動增量的表的最大值

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 32 -1,或者以2為底的11111111111111111111111111111111111。

但是有符號INT使用這些位之一作為符號位,因此有符號整數的最大值為2147483647,即2 31 -1或以2為底的011111111111111111111111111111111111。

可以通過向右移位1位將11111111111111111111111111111111111轉換為011111111111111111111111111111111111。 32位字的最左位用零填充。

現在,對於IF :MySQL將數據類型命名為“ int”或“ int unsigned”。 因此,如果字符串函數LOCATE()找到了單詞“ unsigned”,則最大值為4294967295的整個范圍,因此將其位移0位。 否則,“ unsigned”不會出現在數據類型名稱中,並且int是帶符號的,因此將其位移1位。

另一種說明方式:

  • 最大INT UNSIGNED = 4294967295 = 11111111111111111111111111111111111
  • 最大INT = 2147483647 = 011111111111111111111111111111111 = 4294967295 >> 1

您可能還對我編寫的類似腳本感興趣: https : //github.com/billkarwin/bk-tools/blob/master/pk-full-ratio.sql

雙尖括號(大於符號)是二進制移位運算符。 例如,如果列類型是無符號整數,則它將移位1個位置(實質上是數字的平方),而如果是常規有符號整數,則將不會移位。 有符號整數使用一位表示正數或負數。 無符號整數將該位用作值的一部分,因此它可以容納更高的最大值,但根本不能容納負值。 說得通?

運行了“ 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM