MySQL - 选择然后更新

The*_*Guy 12 mysql select sql-update

我有一个用PHP编写的脚本,它有一行正常工作,可以选择我需要的数据;

$result = mysql_query("SELECT product_name, sku, qty FROM supplier_dropship_items WHERE supplier_id = '3' AND status = '2'", $db_beb);
Run Code Online (Sandbox Code Playgroud)

我正在努力的是一种更新我选择的记录的方法,一旦选中我需要更改,status = '1'以便下次我的脚本运行时它不会在选择中提取相同的数据而只会提取新的项目具有状态2的表.

这是我的工作成果,感谢下面接受的答案的评论;

$result = mysql_query("SELECT id, product_name, sku, qty FROM supplier_dropship_items WHERE supplier_id = '3' AND status = '2' FOR UPDATE", $db_beb); 

while($row = mysql_fetch_assoc($result)) 
{ 
    $sql_table_data[] = $row;
    mysql_query("UPDATE supplier_dropship_items SET status=1 WHERE id='".$row['id']."'", $db_beb); 
} 
Run Code Online (Sandbox Code Playgroud)

Joh*_*ell 18

只要UPDATESELECT同时做它.

改变这个:

SELECT product_name, sku, qty 
FROM supplier_dropship_items 
WHERE supplier_id = '3' AND status = '2';
Run Code Online (Sandbox Code Playgroud)

对此:

UPDATE supplier_dropship_items as t, 
(
    SELECT id, product_name, sku, qty 
    FROM supplier_dropship_items 
    WHERE supplier_id = '3' AND status = '2'
) as temp
SET status = '1' WHERE temp.ID = t.ID;
Run Code Online (Sandbox Code Playgroud)

这假设您的表中有一个ID列,因为它应该如何设置以及任何规范化表的外观.

  • 这种语法在我的MySQL服务器上导致错误:1.需要一个表达式。(在位置39的“(”附近)2.意外的标记。(位置39的“(”附近))3.找到了一个新语句,但它和前一个语句之间没有定界符。(在位置46的“ SELECT”附近) (3认同)

Mar*_*nio 6

如果supplier_dropship_items有一个主键(它应该),那么在那里包含那些字段SELECT,然后,当你循环结果时,UPDATE使用主键执行一个设置status,如:

UPDATE supplier_dropship_items SET status=1 WHERE <id_field>=<id_value>;
Run Code Online (Sandbox Code Playgroud)

这假设您没有在并发环境中执行.如果是,那么您应该使用锁定更新记录SELECT... FOR UPDATE.你可以在这里阅读它.据我所知,这可以在InnoDB表的MySQL下运行.