Mysql 主鍵自增長問題小結

2022-08-18 17:03:13 字數 1462 閱讀 7864

在mysql中,主鍵有auto_increment來保證其自增長,如果我們自定義函式來表示auto_increment的話可以如下:

sql**

create

function

select_autoincrement_id()

returns

int(11)

begin

select

max(id)+1

from

table_name;

end

create function select_autoincrement_id() returns int(11)

begin

select max(id)+1 from table_name;

end

但是,此方法會有併發方面的問題,如兩個事務中就可能獲取到同乙個id而其中乙個失敗,所以需要鎖表

sql**

create

function

select_autoincrement_id()

returns

int(11)

begin

select

max(id)+1

from

table_name

forupdate

; end

create function select_autoincrement_id() returns int(11)

begin

select max(id)+1 from table_name for update;

end

用此種方法的話可以實現一些複雜的自增長邏輯要求,比如在乙個復合主鍵中,要求以其中乙個主鍵為參照物,另乙個主鍵重新從1開始自增長,但缺點是需要鎖表,在大併發環境中會影響一定的效率,在mysql 5.1.22版本之前,均是需要鎖表的,但在5.1.22版本之後,引入了一種新的方法來解決自增長的效率問題,

sql**

innodb_autoinc_lock_mode = 0(全部使用表鎖)

innodb_autoinc_lock_mode = 1(預設,可預判行數時使用新方式,不可時使用表鎖)

innodb_autoinc_lock_mode = 2(全部使用新方式)

innodb_autoinc_lock_mode = 0(全部使用表鎖)

innodb_autoinc_lock_mode = 1(預設,可預判行數時使用新方式,不可時使用表鎖)

innodb_autoinc_lock_mode = 2(全部使用新方式)

在級別1中,引入了乙個輕量級的互斥量,在不同的事務中auto_increment總是可以獲取到最新的自增長主鍵值而不需要鎖表(感覺似乎有點違背mysql預設的事務隔離級別?),但對於無法提前獲知插入行數的sql依然需要鎖表,如insert...select... replace...select... load data 還是使用表鎖

Mysql 主鍵自增長問題小結

在mysql中,主鍵有auto increment來保證其自增長,如果我們自定義函式來表示auto increment的話可以如下 sql create function select autoincrement id returns int 11 begin select max id 1 fro...

mysql 主鍵自增長

mysql 資料庫表主鍵自增長的sql語句 1 不控制主鍵的起點 create table emb t dictbustype emb c bustypeid int not null auto increment,emb c bustypeenname varchar 255 not null,e...

oracle 自增長主鍵

1 首先,你要有一張表!create table example id number 4 not null primary key,name varchar 25 phone varchar 10 address varchar 50 2 然後,你需要乙個自定義的sequence create se...