mysql - last_insert_id - php pdo execute insert id




PDO-lastInsertId()用於多個插入查詢 (6)

文檔狀態: Returns the ID of the last inserted row or sequence value

您將需要執行兩個查詢來獲取每個插入行的id。

我可以插入2個寵物到一個表中,並獲取他們的lastInsertId()進行進一步處理一次(2查詢)。
我想知道是否有辦法得到兩個lastInsertIds()並將它們分配給變量如果我在1查詢中插入2行:

$query = "INSERT INTO pets (pet_name) VALUES (':coco'),(':jojo')";
$pet_insert = $dbh->prepare($query);
$pet_insert->execute(array(':coco' => $coco,':jojo' => $jojo));
$New_PetID = $dbh->lastInsertId();

是否有可能得到coco的lastInsertId()和jojo? 所以像這樣:

$New_PetID1 = $dbh->lastInsertId();//coco
$New_PetID2 = $dbh->lastInsertId();//jojo

這將給出相同的ID,任何方式來獲得2個ID? 僅供參考,這是在一個嘗試塊。


你可以使用'multi_query()'將所有查詢添加到一個變量中,如:'$ sql1 =“first insert”;' '$ sql2 =“第二次插入”;“ '$ sql3 =“第三個插入”;“ 等等...把你要做的插入數量。 現在使用'multi_query()'執行所有'$ sql'查詢。 獲取最後一個插入ID。 現在你所要做的就是'$ rowno = $ lastinsertid - $ countofinserts'。 所以基本上你會得到一個數字。 給它添加1,並從結果編號到最後一個內容是你運行插入查詢的插入ID


我的方法不能解決這個問題,但是對於一些類似的情況可能會有幫助。

當我需要插入大行列表時:

  1. 我從PrimaryKey列中刪除AUTO_INCREMENT ,將其類型更改為BIGINT。
  2. 使用UUID_SHORT()函數準備唯一的PK值列表。 使用單個查詢創建列表使用:
( SELECT UUID_SHORT() ) UNION 
( SELECT UUID_SHORT() ) UNION
( SELECT UUID_SHORT() ) # UNION (...
  1. 用這個準備好的PK列表插入行。

    這種方法特別方便,當我需要插入相關的數據時(例如,準備好的PK列表將用於插入交接表行)。


我試圖假設這是不可能的,直到我自己嘗試,並認為它是可能的

每次執行後,添加lastInsertId()並分配一個鍵。

對於我的例子:

// First query
$sql = "INSERT INTO users
(username, email)
values
(:username, :email)";
$sth = $this->db->prepare($sql);
$sth->bindParam(':username', $data['username'], PDO::PARAM_STR);
$sth->bindParam(':email', $data['email'], PDO::PARAM_STR);

// Second Query
$sql2 = "INSERT INTO users
(username, email)
values
(:username, :email)";
$sth2 = $this->db->prepare($sql2);
$sth2->bindParam(':username', $data['username'], PDO::PARAM_STR);
$sth2->bindParam(':email', $data['email'], PDO::PARAM_STR);

// Start trans
$this->db->beginTransaction();

// Execute the two queries
$sth->execute();
$last['ux1'] = $this->db->lastInsertId(); // <---- FIRST KEY

$sth2->execute();
$last['ux2'] = $this->db->lastInsertId(); // <---- SECOND KEY

// Commit
$this->db->commit();

我能夠檢索到最後兩個插入的ID

Array([create] => Array([ux1] => 117 [ux2] => 118)

我希望這能幫助那些正在尋求正確答案的人。


請避免布魯斯給出的解決方案。 自動遞增值可以設置為不同於1.例如在主複製到主複製的情況下。 稍後我們運行一個應用程序的主機改變了他們的數據庫設置。 我偶然注意到 - 巧合地說 - 突然之間id增加了兩個,而不是一個。 我們是否有這樣的代碼可能會導致我們嚴重的問題。






last-insert-id