在PHP中使用MySQL - 如何仅更新表中具有最大ID编号的一行

20

我正在尝试更新数据库中的字段,但遇到了一个很简单的问题:我想只更新具有最大ID编号的表中的一行。 我会做这样的事情:

UPDATE table SET name='test_name' WHERE id = max(id)

不幸的是它不起作用。有什么想法吗?

表结构

id | name
---|------
 1 | ghost
 2 | fox
 3 | ghost

我想仅更新最后一行,因为ID号是最大的。


请参考以下链接的内容:https://dev59.com/hmox5IYBdhLWcg3wbDok - user5449468
9个回答

74

在这个位置不能使用 MAX() 函数,但是你可以这样做:

UPDATE table SET name='test_name' ORDER BY id DESC LIMIT 1;

对于多表查询,像@Euthyphro所问的那样,使用 table.column
错误提示表示id列是不明确的。

示例:

UPDATE table1 as t1
LEFT JOIN table2 as t2
       ON t2.id = t1.colref_t2
SET t1.name = nameref_t2
ORDER BY t1.id DESC
LIMIT 1

1
只有在使用一张表时才能正常工作。如果在WHERE子句中使用多个表的别名,则会出现“SQL错误(1221):UPDATE和ORDER BY的使用不正确”的错误。 - Euthyphro

6
UPDATE table SET name='test_name' WHERE id = (SELECT max(id) FROM table) 

这个查询会返回错误,因为你不能从正在更新的表中进行SELECT子查询。尝试使用以下方法:
UPDATE table SET name='test_name' WHERE id = (
    SELECT uid FROM (
        SELECT MAX(id) FROM table AS t
    ) AS tmp
)

这将创建一个临时表,允许在UPDATE和SELECT中使用同一张表,但代价是性能下降。


4

我认为iblue的方法可能是你最好的选择;另一个解决方案可能是将结果设置为变量,然后在UPDATE语句中使用该变量。

SET @max = (SELECT max(`id`) FROM `table`);
UPDATE `table` SET `name` = "FOO" WHERE `id` = @max;

如果您希望使用相同的ID运行多个查询,那么这将非常有用,但如果您只执行一个更新操作,则运行两个查询并不理想。


1
不需要使用“LIMIT 1”,因为最多只有一个条目 :) - Muhammad Abrar

2
UPDATE table_NAME
SET COLUMN_NAME='COLUMN_VALUE' 
ORDER BY ID 
DESC LIMIT 1;

因为你不能使用 SELECT IN DELETE OR UPDATE CLAUSE.ORDER BY ID DESC LIMIT 1 这条语句。这样做会给你具有最大值的ID MAX(ID),就像你尝试过的那样。但是 MAX(ID) 不可用。

1

虽然这是一个旧问题,但对于任何遇到此问题的人,您也可以尝试以下方法:

UPDATE
     `table_name` a
JOIN (SELECT MAX(`id`) AS `maxid` FROM `table_name`) b ON (b.`maxid` = a.`id`)
SET a.`name` = 'test_name';

0
我们可以使用 max() 函数来更新记录,也许这对你有所帮助。
 UPDATE MainTable
 SET [Date] = GETDATE()
 where [ID] = (SELECT MAX([ID]) FROM MainTable)

这对我来说完美无缺


0

我需要用连续的数字更新一个表格。

这是我的做法。


UPDATE pos_facturaciondian fdu 
            SET fdu.idfacturacompra = '".$resultado["afectados"]."', 
            fdu.fechacreacion = '".$fechacreacion."'
            WHERE idfacturaciondian = 
            (
                SELECT min(idfacturaciondian) FROM 
                (   
                    SELECT * 
                    FROM pos_facturaciondian fds
                    WHERE fds.idfacturacompra = ''
                    ORDER BY fds.idfacturaciondian
                ) as idfacturaciondian
            )

-2

使用PHP时,我通常会运行mysqli_num_rows,然后将结果放入变量中,然后执行一个UPDATE语句,说ID =新创建的变量。有些人发帖说末尾不需要使用LIMIT 1,但我喜欢这样做,因为它不会造成任何微小的延迟,但可以防止采取任何意外行动。

如果您刚刚插入了行,则可以使用PHP的mysqli_insert_id函数自动将此ID返回给您,而无需运行mysqli_num_rows查询。


如果至少删除了一行,则 mysqli_num_rows 将失败。 - iblue
它根本不会......该命令只是运行一个COUNT(id)的SQL查询。 - Andrew
假设有ID为1、2、3,我要删除ID 2。mysqli_num_rows将返回2行,而最后一个ID仍然是3。 - iblue
哦,糟糕。是的 - 我有一刻钟的失误 :-) 抱歉并谢谢。 - Andrew

-6

首先选择最大的ID,然后进行更新。

UPDATE table SET name='test_name' WHERE id = (SELECT max(id) FROM table)


7
这将导致MySQL错误#1093:"您不能在FROM子句中为更新指定目标表“table”。" MySQL不支持在子查询读取表时更新该表。 - iblue
12
我不明白为什么人们会如此猛烈地对这个进行负评。它只需要对MySQL进行一些小修复:UPDATE table SET name='test_name' WHERE id = (SELECT max(id) FROM (SELECT * FROM table))。如果你决定给出负评,留下评论是一个好习惯,这样回答者就知道如何改进答案。 - luqo33

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接