[英]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.