MySQL - 选择最后插入的行最简单的方法

Posted

技术标签:

【中文标题】MySQL - 选择最后插入的行最简单的方法【英文标题】:MySQL - Select the last inserted row easiest way 【发布时间】:2011-02-15 18:27:48 【问题描述】:

我只需要选择条件指定的最后输入的行,例如:

SELECT ID from bugs WHERE user=Me

我只需要返回用户“我”输入的最后一个 ID。有没有一种简单的方法可以做到这一点?谢谢。

【问题讨论】:

我找到的最佳答案是 Pomyk here的答案 似乎有一个similar thread 已被回答。会不会是您正在寻找的解决方案? 【参考方案1】:

最好有一个默认为CURRENT_TIMESTAMPTIMESTAMP 列。这是您可以在此处找到的唯一真正的预测行为。

你可以做的第二好的事情是ORDER BY ID DESC LIMIT 1,并希望最新的ID是最大值。

【讨论】:

【参考方案2】:

你可以使用ORDER BY ID DESC,但如果你这样做会更快:

SELECT * FROM bugs WHERE ID = (SELECT MAX(ID) FROM bugs WHERE user = 'me')

如果您有一张巨大的桌子,它可能会产生重大影响。

编辑

您甚至可以设置一个变量以防您多次需要它(或者如果您认为它更易于阅读)。

SELECT @bug_id := MAX(ID) FROM bugs WHERE user = 'me';
SELECT * FROM bugs WHERE ID = @bug_id;

【讨论】:

我实际上已经对数百个查询进行了计时。 ORDER BY 'KEY' DESC LIMIT 1,可以比 SELECTSELECT 快 200+ 毫秒(超过 65%)。再说一次,我的数据库非常小,整个查询不会超过 900 毫秒,所以我认为在更大规模的排序可能会更慢。但是话又说回来,mysql 实现可能会优化常用查询,例如ORDER BY 'KEY' DESC LIMIT 1,因此最终结果将花费很多(很多!)而不是实际排序然后返回最后一个结果。 好的,所以使用小桌子可能会更快。很高兴知道!不利的是,对于一张巨大的桌子,我的解决方案仍然要快得多。我用大约 35,000 行的表对其进行了测试,它比使用 ORDER 的解决方案快 10 倍。 这是一个很好的解决方案。快速澄清:为什么我们不能 SELECT * FROM bugs WHERE ID = (SELECT MAX(ID) FROM bugs WHERE user = 'me') ...即为什么我们需要初始用户 = 'me' ? @HopeKing 好点。我前段时间写了这个答案,所以我不确定为什么我两次输入user = 'me'。我对其进行了测试以确保并编辑了我的答案。感谢您指出。【参考方案3】:
SELECT MAX(ID) from bugs WHERE user=Me

【讨论】:

【参考方案4】:

实现此目的的一种方法是对记录进行排序并限制为 1。例如,如果您有下表(“数据”)。

    id | user | price
   -------------------
    1  |  me  | 40.23
    2  |  me  | 10.23

试试下面的sql查询

  select * from data where user='me' order by id desc limit 1

【讨论】:

【参考方案5】:

并发时,最新的记录可能不是你刚刚输入的记录。使用主键获取最新记录可能会更好。

如果是自增字段,使用SELECT LAST_INSERT_ID();获取刚刚创建的id。

【讨论】:

LAST_INSERT_ID() 是全球性的。它不会返回基于条件的 ID。 在您尝试查询的行后不执行插入时有效。例如,如果有人注册(insert into users ...)然后创建一个帖子(insert into posts ...),last_insert_id() 将引用最后一个posts.id。此时,没有办法使用last_insert_id()选择最后一个用户。【参考方案6】:
SELECT * FROM `table_name` 
ORDER BY `table_name`.`column_name` DESC
LIMIT 1 

【讨论】:

【参考方案7】:

在从 php 运行 mysql 查询之后

得到它

$lastid=mysql_insert_id();

这会为您提供 alst 自动增量 id 值

【讨论】:

没有人提到 PHP。即使他们这样做了,您为什么要建议使用已被弃用和无人维护这么长时间,最终在 PHP 7 中删除的 mysql_ 库?这是一个安全风险,如果你有 PHP7 或更高版本,甚至都不会工作。不应使用这个过时的库编写新代码。如果还在用的话,赶紧做个计划迁移到mysqli或者PDO吧。 用户在 MYSQL 而非 MYSQLI 或 PDO 中请求 呃,没有。问题是关于 SQL 代码本身。查看所有其他答案。就像我说的,甚至没有提到 PHP。 OP 对您所写的内容没有任何要求。使用 mysql_mysqli_PDO 不会改变底层 DBMS,它会改变用于连接数据库和执行查询的 PHP 代码库。每个都有不同的语法和功能,但它们都针对 MySQL 数据库服务器执行 SQL 查询。从您的评论看来您可能不了解 PHP 库和 SQL 语言之间的区别?【参考方案8】:
MySqlCommand insert_meal = new MySqlCommand("INSERT INTO meals_category(Id, Name, price, added_by, added_date) VALUES ('GTX-00145', 'Lunch', '23.55', 'User:Username', '2020-10-26')", conn);
if (insert_meal .ExecuteNonQuery() == 1)

    long Last_inserted_id = insert_meal.LastInsertedId;
    MessageBox.Show(msg, "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
            
            else
            
                MessageBox.Show("Failed to save meal");
            

【讨论】:

【参考方案9】:

从错误中选择 ID WHERE user=Me ORDER BY CREATED_STAMP DESC; BY CREATED_STAMP DESC 在最后创建的第一个索引处获取那些数据。

希望能解决你的问题

【讨论】:

以上是关于MySQL - 选择最后插入的行最简单的方法的主要内容,如果未能解决你的问题,请参考以下文章

Python制作9行最简单音乐播放器?不,我不满足

sed简单使用选择性显示

TSQL - 选择插入的行

使用JDBC一次插入多条记录(以MySQL为例)

mysql不是自动增长的主键怎么利用ibatis返回值判断是不是插入成功

访问mysql中最后插入的行