SQLServer / MySQL 自增長 ID 一般用的數(shù)據(jù)類型是 INT 或 BIGINT,正常情況下這兩種類型可以滿足大多數(shù)應(yīng)用的需求。當(dāng)然也有不正常的情況,當(dāng)達(dá)到其最大值時,嘗試插入新的記錄會導(dǎo)致錯誤,錯誤信息類似于:ERROR 167 (22003): Out of range value for column 'id' at row 1
下面我們就來看看 INT 或 BIGINT 到底能插入多少的數(shù)據(jù)。
INT 類型占用 4 個字節(jié),范圍:-2,147,483,648 到 2,147,483,647(如果是無符號類型,則范圍是 0 到 4,294,967,295)也就是說 INT 類型存儲量將近可以達(dá)到 43 億,看著數(shù)量,感覺可以存儲很多條記錄了,我們就來計算下:一年 365 天,一天 24 小時,一小時 60 分鐘,一分鐘 60 秒,如果每秒鐘存儲 100 條記錄看看能用多久:# INT 的最大值
max_int_value = 4294967295
# 每秒記錄數(shù)
records_per_second = 100
# 每年的秒數(shù)
records_per_year = 365 * 24 * 60 * 60
result = max_int_value/(records_per_second * records_per_year)
print(result)
# 結(jié)果:1.3619251950152207
結(jié)果就為 1.3619251950152207,也就是能存儲 1 年多的時間,看來確實不太夠,使用 INT 類型,如果數(shù)據(jù)量過多,自增 ID 很容易超過最大數(shù)值。
BIGINT 占用 8 個字節(jié),范圍:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(如果是無符號類型,則范圍是 0 到 18,446,744,073,709,551,615)假如公司是我家,我準(zhǔn)備在公司呆個 100 年,我們來計算下 BIGINT 使用 100 年支持每秒插入多少數(shù)據(jù)。
BIGINT 類型的最大值:
無符號 BIGINT 類型的最大值為18,446,744,073,709,551,615。
100年×365天/年×24小時/天×60分鐘/小時×60秒/分鐘 = 3,153,600,000# BIGINT 的最大值
max_bigint = 18446744073709551615
# 100年的秒數(shù)
seconds_in_100_years = 365*24*60*60*100
# 計算結(jié)果
result = max_bigint / seconds_in_100_years
print(result)
# 結(jié)果:5849424173.55072
結(jié)果為 5849424173.55072 相當(dāng)于每秒鐘插入 58 億的數(shù)據(jù),這樣的數(shù)據(jù)雙十一都不知道有沒達(dá)到,我用 AI 查找了下淘寶雙十一歷史的最大并發(fā)生:這樣看,我如果使用 ,在公司干個 100 年完全沒問題,即便公司能活 100 年,老板也活不過 120+(假設(shè)老板 20 歲出來繼承家業(yè)),也就是即便我把老板送走,都達(dá)不到最大的值。所以我們只要把自增 ID 設(shè)置為 BIGINT 類型,你根本就不用擔(dān)心自增 ID 會用完,而是要擔(dān)心公司能不能活的比 BIGINT 更長。總結(jié):INT 類型在大多數(shù)情況下足夠使用,當(dāng)需要更大的數(shù)值范圍時,可以考慮使用 BIGINT 類型。如果你的自增 ID 是 INT 類型,要修改 INT 為 BIGINT 可以使用 ALTER 命令:-- 創(chuàng)建表
CREATE TABLE orders (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_data VARCHAR(255)
);
-- 查看表結(jié)構(gòu)
DESCRIBE orders;
-- 修改自增列的數(shù)據(jù)類型
ALTER TABLE orders MODIFY id BIGINT UNSIGNED AUTO_INCREMENT;
-- 再次查看表結(jié)構(gòu),確認(rèn)修改
DESCRIBE orders;
注意事項
- 備份數(shù)據(jù):在進(jìn)行表結(jié)構(gòu)修改之前,最好備份數(shù)據(jù),以防止操作過程中出現(xiàn)意外情況。
- 鎖表:在修改表結(jié)構(gòu)時,表可能會被鎖定,導(dǎo)致短暫的寫操作中斷。盡量在業(yè)務(wù)低峰期進(jìn)行操作。
- 外鍵約束:如果有外鍵約束涉及到要修改的列,需要先刪除相關(guān)外鍵約束,修改列類型后再重新添加外鍵約束。
該文章在 2024/6/17 10:40:18 編輯過