[MySQL] AUTO_INCREMENT 自動累加

在我們使用資料庫存放記錄時,經常會想給該筆記錄一個獨一無二的編號,像是給它一個ID,或是一個Index等等。

方便日後顯示資料、搜尋或是作為兩張資料表 (Table) 連結在一起的key。

但是我們每次都手動給他一個值,這樣實在太不方便了!

因此我們可以使用 AUTO_INCREMENT 來幫助我們。

今天想建立一個記錄用戶資訊的資料表,欄位包含編號、人名、電話及年紀,我們可以這樣建:

CREATE TABLE User (
    ID          int         NOT NULL AUTO_INCREMENT,
    Name        varchar(50) NOT NULL,
    Telephone   varchar(20),
    Age         int,
    PRIMARY KEY(ID)
);

將ID設為Primary key,並給予自動累加的功能。

 

接著我們要加入資料進入這張資料表,只要這樣做:

INSERT INTO User (Name, Telephone, Age)
VALUES ('Ian', '0987654321', '24'), 
       ('Rex', '0912345678', '20'), 
       ('Ash', '0988776655', '18');

我們不需要對 ID 給值,他會自動從一開始設定的值 (預設是1) 一直累加上去。

資料庫會長這樣:

ID Name Telephone Age
1 Ian 0987654321 24
2 Rex 0912345678 20
3 Ash 0988776655 18

 

比較特別的是,當你把記錄刪除,設定AUTO_INCREMENT的欄位也不會回復,他會再繼續加上去。

舉個例子,我們刪掉1筆資料,再加入1筆資料:

DELETE FROM User WHERE Name = 'Ash';

INSERT INTO User (Name, Telephone, Age)
VALUES ('Roy', '0911223344', '30');

資料庫會長這樣:

ID Name Telephone Age
1 Ian 0987654321 24
2 Rex 0912345678 20
4 Roy 0911223344 30

ID 3 就再也看不見囉。

 

而當我們想要重設AUTO_INCREMENT的值要這樣做:

ALTER TABLE User AUTO_INCREMENT = 1;

當然數字可以設自己喜歡的數字唷!

 

最後,當我們這個資料表真的實際運行後,一定會想這樣累加下去,會不會有問題?

其實這要看我們當初設定的欄位,它的資料形態是哪個,像是我們的 ID 設定是 int,那它的上限就到231-1那麼大,也就是 2,147,483,647。

可以存放21億筆資料,就看你覺得夠不夠用了。

 

那最大可以開到多少?我目前知道的是能用到 264 那麼大。

舉例來說,我們修改一下當初建的資料表:

CREATE TABLE User (
    ID          bigint unsinged  NOT NULL AUTO_INCREMENT,
    Name        varchar(50)      NOT NULL,
    Telephone   varchar(20),
    Age         int,
    PRIMARY KEY(ID)
);

把 ID 的型態改成 bigint unsinged。

原本 bigint 的範圍是 -263 ~ 263-1,加了unsinged,讓值只有正數,範圍變成 0 ~ 264-1。

最大值可以到 18,446,744,073,709,551,615,這樣應該很夠用了吧!

 

我們可以來算一下,假設這資料表要用100年,365天都會有資料進來,來算算看它一秒最多可以存幾筆資料?

18,446,744,073,709,551,615 / 100 (年) / 365 (天) / 24 (時) / 60 (分) / 60 (秒) = 5,849,424,174 (四捨五入至整數)

50億啊!

所以,當你的資料量沒有達到 "一秒五十億" ,那就不用擔心 ID 會用完的問題了~