mysql自增欄位重排 mysql刪除表後自增欄位從1開始

來源:互聯網
上載者:User

MyISAM資料表

刪除最大編號的記錄後,該編號不可重用。

可在建表時可用“AUTO_INCREMENT=n”選項來指定一個自增的初始值。

可用alter table table_name AUTO_INCREMENT=n命令來重設自增的起始值。

 

其他:

由於刪除了某些記錄行,所以自增欄位不連續了

1,3,4,5,7,10這樣子

 

 

 

 

-------------------------

truncate命令是會把自增的欄位還原為從1開始的,或者你試試把table_a清空,然後取消自增,儲存,再加回自增,這也是自增段還原為1的方法。

-----------

MySql資料庫唯一編號欄位(自動編號欄位)
在資料庫應用,我們經常要用到唯一編號,以標識記錄。在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表就可產生唯一的序列編號。不

會影響其它客戶程式的正常表操作。

有兩點需要加強注意:
1、只有一列的時候是不行的!
2、自動編號必須作為主鍵才有效!

============================

若要重新恢複1,2,3,4,5,6,7連續排序只需要做:將自增字 段刪除,然後再重新添加自增欄位即可。------------------------------------------------------------------方法1:
truncate table 你的表名
//這樣不但將資料全部刪除,而且重新置放自增的欄位

方法2:
delete from 你的表名
dbcc checkident(你的表名,reseed,0)
//重新置放自增的欄位,讓它從1開始

方法3:
如果你要儲存你的資料,介紹你第三種方法,by QINYI
用phpmyadmin匯出資料庫,你在裡面會有發現哦
編輯sql檔案,將其中的自增下一個id號改好,再匯入。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.