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_TIMESTAMP
的TIMESTAMP
列。这是您可以在此处找到的唯一真正的预测行为。
你可以做的第二好的事情是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
,可以比 SELECT
的 SELECT
快 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 - 选择最后插入的行最简单的方法的主要内容,如果未能解决你的问题,请参考以下文章