在mysql中,使用auto_increment型別的id欄位作為表的主鍵,並用它作為其他表的外來鍵,形成「主從表結構」,這是資料庫設計中常見的用法。但是在具體生成id的時候,我們的操作順序一般是:先在主表中插入記錄,然後獲得自動生成的id,以它為基礎插入從表的記錄。這裡面有個困難,就是插入主表記錄後,如何獲得它對應的id。通常的做法,是通過「select max(id) from tablename」的做法,但是顯然這種做法需要考慮併發的情況,需要在事務中對主表加以「x鎖「,待獲得max(id)的值以後,再解鎖。這種做法需要的步驟比較多,有些麻煩,而且併發性也不好。有沒有更簡單的做法呢?答案之一是通過select last_insert_id()這個操作。乍一看,它和select max(id)很象,但實際上它是執行緒安全的。也就是說它是具體於資料庫連線的。下面通過實驗說明:
1、在連線1中向a表插入一條記錄,a表包含乙個auto_increment型別的字段。
2、在連線2中向a表再插入一條記錄。
3、結果:在連線1中執行select last_insert_id()得到的結果和連線2中執行select last_insert_id()的結果是不同的;而在兩個連線中執行select max(id)的結果是相同的。
其實在mssql中scope_identity()和ident_current()的區別和這裡是類似的。使用scope_identity()可以獲得插入某個identity欄位的當前會話的值,而使用ident_current()會獲得在某個identity欄位上插入的最大值,而不區分不同的會話。
注:使用select last_insert_id()時要注意,當一次插入多條記錄時,只是獲得第一次插入的id值,務必注意!可以試試
insert into tb(c1,c2) values (c1value,c2value),(c1value1,c2value2)..。
最後有個問題一直沒解決:
使用select last_insert_id()時要注意,當一次插入多條記錄時,只是獲得第一次插入的id值,務必注意。
級聯批量插入,也就是一次插入多條記錄,那怎麼正確的獲得主表每次插入的id值呢?使用auto_increment型別的id欄位作為表的主鍵。
希望路過的高手不吝賜教,小弟不勝感激。
參考:
如何準確高效的獲取資料庫新插入資料的主鍵id
例如我們新建了一張表userinformation,字段如下id,為主鍵,自增,其它欄位name,pwd,email 然後我們來執行乙個新增插入操作 insert into userinformation name,pwd,email values 小明 123 111 我們想在新增插入資料的時候獲...
如何在C 中獲取新插入的identity列值
在sql server中identity列是自動增量的列,每次插入新的列時該列會自動填入新的唯一值,在許多應用中需要在插入一條記錄的之後獲得剛插入記錄的identity列的值,許多 介紹了在插入後立刻執行 identity等值即函式的查詢,但是那都是在同乙個session下的t sql,在乙個儲存過...
Mysql高效插入 更新資料
從tushare抓取到的財務資料,最開始只是想存下來,用的辦法想簡單點,是 插入 報錯 update 但發現這個方法太蠢,異常會導致大量無效連線,改為 for idx,row in d2.iterrows try rs db.getdata select f code,f time,s from c...