从mysql获取最后一条记录
我正在使用mysql并面临一些问题。 我想检索插入的最后一行。
<>
以下是我创建表格的方法。
create table maxID (myID varchar(4))
我在其中插入了四个值,如下所示
insert into maxID values ('A001') insert into maxID values ('A002') insert into maxID values ('A004') insert into maxID values ('A003')
当我select myID, last_insert_id() as NewID from maxID
执行select myID, last_insert_id() as NewID from maxID
,我得到如下输出
myId NewID A001 0 A002 0 A004 0 A003 0
当我尝试下面的代码,
select myId, last_insert_id() as NewID, @rowid:=@rowid+1 as myrow from maxID, (SELECT @rowid:=0) as init
我得到如下输出。
myId NewID rowid A001 0 1 A002 0 2 A004 0 3 A003 0 4
但是当我使用代码select myId, last_insert_id() as NewID, @rowid:=@rowid+1 as myrow from maxID, (SELECT @rowid:=0) as init where @rowid = 4
,我得到错误为Uknown column 'myrow' in where clause
当我where @rowid=4
使用时,我没有在表格中获得任何数据。
链接播放数据
注意:这里我使用4来获得所需的输出。 稍后我可以从查询中获取此信息(select max(rowid) from maxID)
如果我只想查看最后一条记录,即A003
请建议我需要做什么。
谢谢你的时间。
更新:
我的表中已有数百万个数据,因此我无法在其中添加新列,如下所示。
看来SELECT
不能保证以任何特定顺序返回行(当然不使用ORDER BY
子句)。
根据SQL-92标准 (p.373):
如果未指定
,则 指定的表为T,T中的行顺序与实现有关。
好的,MySQL并不完全符合SQL-92标准,但这是一个严肃的提示。
Laurynas Biveinis(显然隶属于Percona ) 也指出 :
没有
ORDER BY
子句(…)的行的顺序可能因月相而不同,这是可以的。
关于InnoDB的MySQL手册说:
InnoDB总是根据[
PRIMARY KEY
或NOT NULL UNIQUE
索引]对表行进行排序(如果存在)。
就我而言,我假设 MySQL也可以在OPTIMIZE TABLE
之后对行重新排序,甚至在多次删除和插入后重复使用空格(我试图找到一个这样的例子 ,到目前为止都失败了)。
鉴于你的表格结构,不幸的是,底线是如此多的因素可能改变了行的顺序; 我看不到可靠地确定插入顺序的解决方案。 除非你创建表后保留了所有二进制日志,当然;)
不过,您可能仍希望在表中添加sequence
列。 现有行将被分配一个可能不准确的序列号,但至少将来的行将被正确排序。
ALTER TABLE maxID ADD sequence INT DEFAULT NULL; ALTER TABLE maxID ADD INDEX(sequence); ALTER TABLE maxID MODIFY sequence INT AUTO_INCREMENT;
几乎完成了。 您成功获得了插入顺序。 所以:
select myId, @rowid:=@rowid+1 as myrow from maxID, (SELECT @rowid:=0) as init ORDER BY myrow desc LIMIT 1;
在我的控制台中,我得到以下内容:
mysql> select myId, @rowid:=@rowid+1 as myrow from maxID, (SELECT @rowid:=0) as init ORDER BY myrow desc LIMIT 1; +------+-------+ | myId | myrow | +------+-------+ | A003 | 4 | +------+-------+ 1 row in set (0.00 sec)
演示
UPDATE
牦牛是对的。 我的解决方案不是确定性的。 也许它适用于少量记录。 我发现大量的post abount不可靠的SELECT语句的默认排序( 例如这里 )。 下一步:
- 在哪些条件下,默认的SELECT排序与插入顺序匹配?
- 是否可以在没有增量ID或插入时间戳的表中获取最后插入的记录?
我知道这不是答案,但说明问题会限制问题。
从插入脚本中, A004
不是最后插入的记录。 这是第三个。 如果您想按字母顺序( A004
是)获取最后一条记录,则必须使用
select myID from maxID order by myID desc limit 1
如果您想要最后插入的行,为什么不使用向表中添加自动增量列? 这就是那些列的重点。 自动增量列不必是PK(它应该是,但如果您没有选择则不必)。
正如在last_insert_id
的MySQL帮助中所提到的,您只能将其与**自动增量列一起使用。 这意味着您无法让MySQL找到最近插入的行,除非您了解ID的顺序。 如果按照您的示例建议对它们进行排序,则可以使用
SELECT * FROM maxID WHERE myId = max(myId)
但我建议在表中添加一个自动增量列 ,然后在WHERE
子句中使用= last_insert_id()
。 有关如何获取最后一个ID的信息,另请参阅此页面 。
last_insert_id不起作用,因为它只返回自动增量字段生成的最后一个值。 不过,我认为解决方案可能走在正确的轨道上。 我建议添加另一个自动增量整数列。 然后,您可以插入数据并检索刚刚插入的行,选择last_insert_id()。 要检索最新的行(由任何进程插入),请选择新列的最大数量,或按其desc进行排序。
如果要使用varchar列,可以进行字母排序,但这并不能保证它将是您插入行的最后一行,甚至是最近插入的行。
我能想到的另一个解决方案可能就是创建一个存储过程,创建行,将其插入表中,然后将其返回给您。
您对@rowid的使用只是计算返回给您的订单行。 无法保证按照从最旧到最新的顺序将它们退回给您。 有许多因素会影响行的存储顺序。
请使用以下查询。
Select * from maxID order by myId desc limit 1,1;