在數據庫應用,咱們常常要用到惟一編號,以標識記錄。在MySQL中可經過數據列的 AUTO_INCREMENT屬性來自動生成。MySQL支持多種數據表,每種數據表的自增屬性都有差別,這裏將介紹各類數據表裏的數據列自增屬性。 ISAM表 若是把一個NULL插入到一個AUTO_INCREMENT數據列裏去,MySQL將自動生成下一個序列編號。編號從1開始,並1爲基數遞增。 把0插入AUTO_INCREMENT數據列的效果與插入NULL值同樣。但不建議這樣作,仍是以插入NULL值爲好。 當插入記錄時,沒有爲AUTO_INCREMENT明確指定值,則等同插入NULL值。 當插入記錄時,若是爲AUTO_INCREMENT數據列明確指定了一個數值,則會出現兩種狀況,狀況一,若是插入的值與已有的編號重複,則會出現出錯信 息,由於AUTO_INCREMENT數據列的值必須是惟一的;狀況二,若是插入的值大於已編號的值,則會把該插入到數據列中,並使在下一個編號將從這個 新值開始遞增。也就是說,能夠跳過一些編號。 若是自增序列的最大值被刪除了,則在插入新記錄時,該值被重用。 若是用UPDATE命令更新自增列,若是列值與已有的值重複,則會出錯。若是大於已有值,則下一個編號從該值開始遞增。 若是用replace命令基於AUTO_INCREMENT數據列裏的值來修改數據表裏的現有記錄,即AUTO_INCREMENT數據列出如今了 replace命令的where子句裏,相應的AUTO_INCREMENT值將不會發生變化。但若是replace命令是經過其它的PRIMARY KEY OR UNIQUE索引來修改現有記錄的(即AUTO_INCREMENT數據列沒有出如今replace命令的where子句中),相應的 AUTO_INCREMENT值--若是設置其爲NULL(如沒有對它賦值)的話--就會發生變化。 last_insert_id()函數可得到自增列自動生成的最後一個編號。但該函數只與服務器的本次會話過程當中生成的值有關。若是在與服務器的本次會話中還沒有生成AUTO_INCREMENT值, 則該函數返回0。 其它數據表的自動編號機制都以ISAM表中的機制爲基礎。 MyISAM數據表 刪除最大編號的記錄後,該編號不可重用。 可在建表時可用「AUTO_INCREMENT=n」選項來指定一個自增的初始值。 可用alter table table_name AUTO_INCREMENT=n命令來重設自增的起始值。 可以使用複合索引在同一個數據表裏建立多個相互獨立的自增序列,具體作法是這樣的:爲數據表建立一個由多個數據列組成的PRIMARY KEY OR UNIQUE索引,並把AUTO_INCREMENT數據列包括在這個索引裏做爲它的最後一個數據列。這樣,這個複合索引裏,前面的那些數據列每構成一種 獨一無二的組合,最末尾的AUTO_INCREMENT數據列就會生成一個與該組合相對應的序列編號。 HEAP數據表 HEAP數據表從MySQL4.1開始才容許使用自增列。 自增值可經過CREATE TABLE語句的 AUTO_INCREMENT=n選項來設置。 可經過ALTER TABLE語句的AUTO_INCREMENT=n選項來修改自增始初值。 編號不可重用。 HEAP數據表不支持在一個數據表中使用複合索引來生成多個互不干擾的序列編號。 BDB數據表 不可經過CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n選項來改變自增初始值。 可重用編號。 支持在一個數據表裏使用複合索引來生成多個互不干擾的序列編號。 InnDB數據表 不可經過CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n選項來改變自增初始值。 不可重用編號。 不支持在一個數據表裏使用複合索引來生成多個互不干擾的序列編號。 在使用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; or truncate 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表就可生成惟一的序列編號。不會影響其它客戶程序的正常表操做。 |
alter table table_name auto_increment=n;
注意n只能大於已有的auto_increment的整數值,小於的值無效.
show table status like 'table_name' 能夠看到auto_increment這一列是表現有的值.
步進值無法改變.只能經過下面提到last_inset_id()函數變通使用
在使用AUTO_INCREMENT時,應注意如下幾點:
AUTO_INCREMENT是數據列的一種屬性,只適用於整數類型數據列。
設置AUTO_INCREMENT屬性的數據列應該是一個正數序列,因此應該把該數據列聲明爲UNSIGNED,這樣序列的編號個可增長一倍。
AUTO_INCREMENT數據列必須有惟一索引,以免序號重複。
AUTO_INCREMENT數據列必須具有NOT NULL屬性。
AUTO_INCREMENT數據列序號的最大值受該列的數據類型約束,如TINYINT數據列的最大編號是127,如加上UNSIGNED,則最大爲 255。一旦達到上限,AUTO_INCREMENT就會失效。
在不用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表就可生成惟一的序列編號。不會影響其它客戶程序的正常表操做。html
有兩點須要增強注意:
一、只有一列的時候是不行的!
二、自動編號必須做爲主鍵纔有效!java