簡體   English   中英

如何獲取MySQL中最后更新的行的ID?

[英]How to get ID of the last updated row in MySQL?

如何使用PHP獲取MySQL中最后更新的行的ID?

我找到了這個問題的答案:)

SET @update_id := 0;
UPDATE some_table SET column_name = 'value', id = (SELECT @update_id := id)
WHERE some_other_column = 'blah' LIMIT 1; 
SELECT @update_id;

由aefxx 編輯

可以進一步擴展此技術以檢索受更新語句影響的每一行的ID:

SET @uids := null;
UPDATE footable
   SET foo = 'bar'
 WHERE fooid > 5
   AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;

這將返回一個字符串,其中所有ID都由逗號連接。

嗯,令我驚訝的是,在答案中我沒有看到最簡單的解決方案。

假設item_iditems表中的整數標識列,並且使用以下語句更新行:

UPDATE items
SET qwe = 'qwe'
WHERE asd = 'asd';

然后,要知道該語句之后的最新受影響的行,應將語句稍作更新為以下內容:

UPDATE items
SET qwe = 'qwe',
    item_id=LAST_INSERT_ID(item_id)
WHERE asd = 'asd';
SELECT LAST_INSERT_ID();

如果您只需要更新真正更改的行,則需要通過LAST_INSERT_ID添加對item_id的條件更新,以檢查行中的數據是否要更改。

這在官方上很簡單,但明顯違反直覺。 如果您正在做:

update users set status = 'processing' where status = 'pending'
limit 1

更改為此:

update users set status = 'processing' where status = 'pending'
and last_insert_id(user_id) 
limit 1

where子句中添加last_insert_id(user_id)告訴MySQL 其內部變量設置為找到的行的ID。 當您像這樣將值傳遞給last_insert_id(expr) ,它最終會返回該值,對於像此處這樣的ID來說,它始終是一個正整數,因此始終求值為true,而不會干擾where子句。 這僅在實際找到某行的情況下才有效,因此請記住檢查受影響的行。 然后,您可以通過多種方式獲取ID。

MySQL的last_insert_id()

您可以生成序列而無需調用LAST_INSERT_ID(),但是以這種方式使用該函數的實用程序是ID值作為最后自動生成的值在服務器中維護。 這是多用戶安全的,因為多個客戶端可以發出UPDATE語句並使用SELECT語句(或mysql_insert_id())獲得自己的序列值,而不會影響或受到生成自己序列值的其他客戶端的影響。

MySQL的mysql_insert_id()

返回由先前的INSERT或UPDATE語句為AUTO_INCREMENT列生成的值。 對包含AUTO_INCREMENT字段的表執行INSERT語句,或者使用INSERT或UPDATE設置帶有LAST_INSERT_ID(expr)的列值后,請使用此函數。

LAST_INSERT_ID()和mysql_insert_id()之間存在差異的原因是,使得LAST_INSERT_ID()易於在腳本中使用,而mysql_insert_id()試圖提供有關AUTO_INCREMENT列發生了什么的更准確的信息。

PHP mysqli_insert_id()

使用LAST_INSERT_ID()函數執行INSERT或UPDATE語句還將修改mysqli_insert_id()函數返回的值。

放在一起:

$affected_rows = DB::getAffectedRows("
    update users set status = 'processing' 
    where status = 'pending' and last_insert_id(user_id) 
    limit 1"
);
if ($affected_rows) {
    $user_id = DB::getInsertId();
}

(僅供參考, DB類在這里 。)

這與Salman A的答案相同,但是這是您實際需要執行的代碼。

首先,編輯您的表,以便它可以自動跟蹤每當修改行時。 如果只想知道最初插入行的時間,請刪除最后一行。

ALTER TABLE mytable
ADD lastmodified TIMESTAMP 
    DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP;

然后,要查找最后更新的行,可以使用此代碼。

SELECT id FROM mytable ORDER BY lastmodified DESC LIMIT 1;

這段代碼都是從MySQL和PostgreSQL摘錄的:在表MySQL手冊:對行進行排序中 添加了“上次修改時間”列 我剛剛組裝好了。

查詢:

$sqlQuery = "UPDATE 
            update_table 
        SET 
            set_name = 'value' 
        WHERE 
            where_name = 'name'
        LIMIT 1;";

PHP功能:

function updateAndGetId($sqlQuery)
{
    mysql_query(str_replace("SET", "SET id = LAST_INSERT_ID(id),", $sqlQuery));
    return mysql_insert_id();
}

這對我有用;)

最后更新的行的ID與您在“ updateQuery”中用於查找和更新該行的ID相同。 因此,無論如何,只要保存(調用)該ID即可。

last_insert_id()取決於AUTO_INCREMENT ,但不取決於最后更新的ID。

嘿,我只需要一個技巧-我以另一種方式解決了它,也許對您有用。 請注意,這不是可擴展的解決方案,對於大型數據集將非常不利。

將查詢分為兩部分-

首先,選擇要更新的行的ID,並將其存儲在臨時表中。

其次,執行原始更新,將update語句中的條件更改為where id in temp_table

為了確保並發性,您需要在這兩個步驟之前鎖定表,然后在最后釋放鎖。

同樣,這對我來說是有效的,對於以limit 1結尾的查詢,所以我什至不使用臨時表,而只是使用一個變量來存儲first select的結果。

我更喜歡這種方法,因為我知道我將總是只更新一行,並且代碼很簡單。

除上述公認答案之外,還有更多
對於那些想知道:==

:==之間的顯着區別是, :=在任何地方都可以用作變量賦值運算符,而=只能在SET語句中用作變量賦值運算符,而在其他地方則都是比較運算符。

所以SELECT @var = 1 + 1; 將使@var保持不變,並返回一個布爾值 (1或0,具體取決於@var的當前值),而SELECT @var := 1 + 1; @var更改為2 ,並返回2 [資源]

如果您只進行插入操作,並且希望在同一會話中進行插入操作,請按照peirix的回答進行操作。 如果要進行修改,則需要修改數據庫架構以存儲最近更新的條目。

如果您想要上次修改的ID(可能是來自其他會話的ID)(即不是當前運行的PHP代碼剛剛完成的ID,而是為了響應不同的請求而完成的ID),則可以添加一個表的TIMESTAMP列稱為last_modified(有關信息,請參見http://dev.mysql.com/doc/refman/5.1/en/datetime.html ),然后在更新時設置last_modified = CURRENT_TIME。

設置好之后,您可以使用以下查詢:SELECT id FROM table ORDER BY last_modified DESC LIMIT 1; 獲取最近修改的行。

我的解決方案是,首先使用select命令確定“ id”(@ uids),然后使用@uids更新此id。

SET @uids := (SELECT id FROM table WHERE some = 0 LIMIT 1);
UPDATE table SET col = 1 WHERE id = @uids;SELECT @uids;

它對我的項目有效。

SET @uids := "";
UPDATE myf___ingtable
   SET id = id
   WHERE id < 5
  AND ( SELECT @uids := CONCAT_WS(',', CAST(id AS CHAR CHARACTER SET utf8), @uids) );
SELECT @uids;

我不得不CAST id(不知道為什么)...或者我無法獲取@uids內容(這是一個斑點)。順便說一句,感謝Pomyk的回答!

不需要那么長的Mysql代碼。 在PHP中,查詢應如下所示:

$updateQuery = mysql_query("UPDATE table_name SET row='value' WHERE id='$id'") or die ('Error');
$lastUpdatedId = mysql_insert_id();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM