天天看點

MYSQL删除表的記錄後如何使ID從1開始

  方法1:

  truncate table 你的表名

  //這樣不但将資料全部删除,而且重新定位自增的字段

  方法2:

  delete from 你的表名

  dbcc checkident(你的表名,reseed,0)

  //重新定位自增的字段,讓它從1開始

  方法3:

  如果你要儲存你的資料,介紹你第三種方法,by QINYI

  用phpmyadmin導出資料庫,你在裡面會有發現哦

  編輯sql檔案,将其中的自增下一個id号改好,再導入。

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

  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表就可生成唯一的序列編号。不

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