从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 KEYNOT 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; 

http://sqlfiddle.com/#!2/63a8d/1

几乎完成了。 您成功获得了插入顺序。 所以:

 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;