在我們使用資料庫存放記錄時,經常會想給該筆記錄一個獨一無二的編號,像是給它一個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 會用完的問題了~