From : http://blog.chinaunix.net/space.php?uid=13626447&do=blog&cuid=392987
用法:
CREATE TABLE test
(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(15) NOT NULL
)
AUTO_INCREMENT = 100;
在資料庫應用,我們經常要用到唯一編號,以標識記錄。在MySQL中可通過資料列的AUTO_INCREMENT屬性來自動產生。MySQL支援多種資料表,每種資料表的自增屬性都有差異,這裡將介紹各種資料表裡的資料列自增屬性。
在使用AUTO_INCREMENT時,應注意以下幾點:
AUTO_INCREMENT是資料列的一種屬性,只適用於整數類型資料列。
設定AUTO_INCREMENT屬性的資料列應該是一個正數序列,所以應該把該資料列聲明為UNSIGNED,這樣序列的編號個可增加一倍。
AUTO_INCREMENT資料列必須有唯一索引,以避免序號重複。
AUTO_INCREMENT資料列必須具備NOT NULL屬性。
AUTO_INCREMENT資料列序號的最大值受該列的資料類型約束,如TINYINT資料列的最大編號是127,如加上UNSIGNED,則最大為255。一旦達到上限,AUTO_INCREMENT就會失效。
當進行全表刪除時,AUTO_INCREMENT會從1重新開始編號。全表刪除的意思是發出以下兩條語句時:
delete from table_name;ortruncate table table_name
這是因為進行全表操作時,MySQL實際是做了這樣的最佳化操作:先把資料表裡的所有資料和索引刪除,然後重建資料表。如果想刪除所有的資料行又想保留序列編號資訊,可這樣用一個帶where的delete命令以抑制MySQL的最佳化:
delete from table_name where 1;
這將迫使MySQL為每個刪除的資料行都做一次條件運算式的求值操作。
強制MySQL不複用已經使用過的序列值的方法是:另外建立一個專門用來產生AUTO_INCREMENT序列的資料表,並做到永遠不去刪除該表的記錄。當需要在主要資料表裡插入一條記錄時,先在那個專門產生序號的表中插入一個NULL值以產生一個編號,然後,在往主要資料表裡插入資料時,利用LAST_INSERT_ID()函數取得這個編號,並把它賦值給主表的存放序列的資料列。如:
insert into id set id = NULL;insert into main set main_id = LAST_INSERT_ID();
可用alter命令給一個資料表增加一個具有AUTO_INCREMENT屬性的資料列。MySQL會自動產生所有的編號。
要重新排列現有的序列編號,最簡單的方法是先刪除該列,再重建該,MySQL會重新生連續的編號序列。
在不用AUTO_INCREMENT的情況下產生序列,可利用帶參數的LAST_INSERT_ID()函數。如果用一個帶參數的LAST_INSERT_ID(expr)去插入或修改一個資料列,緊接著又調用不帶參數的LAST_INSERT_ID()函數,則第二次函數調用返回的就是expr的值。下面示範該方法的具體操作:
先建立一個只有一個資料行的資料表:create table seq_table (id int unsigned not null);insert into seq_table values (0);接著用以下操作檢索出序號:
update seq_table set seq = LAST_INSERT_ID( seq + 1 );select LAST_INSERT_ID();
通過修改seq+1中的常數值,可產生不同步長的序列,如seq+10可產生步長為10的序列。
該方法可用於計數器,在資料表中插入多行以記錄不同的計數值。再配合LAST_INSERT_ID()函數的傳回值產生不同內容的計數值。這種方法的優點是不用事務或LOCK,UNLOCK表就可產生唯一的序列編號。不會影響其它客戶程式的正常表操作。