MySql資料庫自動遞增值問題

2022-09-26 00:21:11 字數 3852 閱讀 9787

create table test

(id int unsigned not null primary key auto_increment,

username varchar(15) not null

)auto_increment = 100;

在資料庫應用,我們經常要用到唯一編號,以標識記錄。在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重新開始編號。全表刪除www.cppcns.com的意思是發出以下兩條語句時:

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表就可生成唯一的序列編號。不會影響其它客戶程式的正常表操作。

下面給大家介紹mysql資料庫修改自動遞增值

alter table tablename auto_increment=num

其中tablename為表的名稱,num為要設定的新的自動遞增值,此時再insert一條資料,自動遞增值即為num,不過num必須要大於等iwznfrlzt於現在已有的自動遞增值,否則sql語句會執行成功,但是實際上不起作用。

本文標題: mysql資料庫自動遞增值問題

本文位址:

mysql資料庫自動備份 mysql資料庫自動備份

通過簡單的設定,可以讓mysql資料庫備份自動化.減少維護的工作量 一 對於windows主機 假想環境 mysql 安裝位置 c mysql 論壇資料庫名稱為 bbs mysql root 密碼 123456 資料庫備份目的地 d db backup echo off c mysql bin my...

mysql 資料庫自動備份

1 把下面的 放到記事本txt檔案當中,在把檔案.txt副檔名改為.bat。2 下面的 中修改相應的引數 紅色部分 3 使用系統的任務計畫做乙個每一天啟動這個bat檔案的任務,完成備份。開始 for f tokens 1 delims i in date t do set dt i for f to...

mysql資料庫自動備份

mkdir mysqldatabackup 建立執行備份指令碼vi mysqldatabackup.sh bin bash mysqldump uroot pwzax123 qhds gzip home mysqldatabackup qhds date y m d h m s sql.gz建立執行...