Mysql 主鍵自增長問題小結

2021-06-08 21:49:10 字數 1441 閱讀 2985

在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 for

update;

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...