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