Posted on 2012-03-13 15:36
小白19870626 閱讀(477)
評論(0) 編輯 收藏 所屬分類:
MySql
用法:
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表就可生成唯一的序列編號。不會影響其它客戶程序的正常表操作。
小白