在一個(gè)事物當(dāng)中包含了多張表的級(jí)聯(lián)更新; 第一張需要更新的表是主表,,其他從表和其相關(guān),因此需要主表的主鍵,,那么如何在mysql當(dāng)中實(shí)現(xiàn)呢,? mysql有l(wèi)ast_insert_id()這個(gè)函數(shù)
它的用法如下:記錄下來備忘
它必需緊跟在insert 語句執(zhí)行之后。
//執(zhí)行insert語句先
$sql="insert into table (name1,name2,...) values('value1','values'...)";
dbx_query($db_link,$sql);
//找出最后一次插入記錄的id
$select="select last_insert_id() ";
$result=dbx_query($db_link,$select);
$last_id=$result->data[0][0];
ps: $last_id=mysql_insert_id();
mysql_insert_id() 將 MySQL 內(nèi)部的 C API 函數(shù) mysql_insert_id() 的返回值轉(zhuǎn)換成 long(PHP 中命名為 int),。如果 AUTO_INCREMENT 的列的類型是 BIGINT,,則 mysql_insert_id() 返回的值將不正確??梢栽?SQL 查詢中用 MySQL 內(nèi)部的 SQL 函數(shù) LAST_INSERT_ID() 來替代,。
LAST_INSERT_ID 自動(dòng)返回最后一個(gè) INSERT 或 UPDATE 操作為 AUTO_INCREMENT 列設(shè)置的第一個(gè)發(fā)生的值. 參考這里 The ID that was generated is maintained in the server on a per-connection basis. LAST_INSERT_ID是基于單個(gè)connection的, 不可能被其它的客戶端連接改變,。 可以用 SELECT LAST_INSERT_ID(); 查詢LAST_INSERT_ID的值. Important: If you insert multiple rows using a single INSERT statement, LAST_INSERT_ID() returns the value generated for the first inserted row only. 使用單INSERT語句插入多條記錄, LAST_INSERT_ID只返回插入的第一條記錄產(chǎn)生的值. 比如 mysql> INSERT INTO t VALUES (NULL, 'aaaa'), (NULL, 'bbbb'), (NULL, 'cccc'); mysql> SELECT * FROM t; +----+------+ | id | name | +----+------+ | 1 | Bob | | 2 | aaaa | | 3 | bbbb | | 4 | cccc | +----+------+ mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 2 | +------------------+ ID 2 是在插入第一條記錄aaaa 時(shí)產(chǎn)生的. LAST_INSERT_ID 是與table無關(guān)的,,如果向表a插入數(shù)據(jù)后,再向表b插入數(shù)據(jù),,LAST_INSERT_ID會(huì)改變,。 一般情況下獲取剛插入的數(shù)據(jù)的id,使用select max(id) from table 是可以的,。 但在多線程情況下,,就不行了。在多用戶交替插入數(shù)據(jù)的情況下max(id)顯然不能用,。 這就該使用LAST_INSERT_ID了,,因?yàn)長(zhǎng)AST_INSERT_ID是基于Connection的,只要每個(gè)線程都使用獨(dú)立的Connection對(duì)象,,LAST_INSERT_ID函數(shù)將返回該Connection對(duì)AUTO_INCREMENT列最新的insert or update操作生成的第一個(gè)record的ID,。這個(gè)值不能被其它客戶端(Connection)影響,保證了你能夠找回自己的 ID 而不用擔(dān)心其它客戶端的活動(dòng),,而且不需要加鎖,。 |
|