从mysql获取最后一条记录

时间:2012-01-19 08:59:23

标签: java mysql sql last-insert-id

我正在使用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时,我得到如下输出

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时,表格中没有任何数据。

Link to play with data

注意:这里我使用4来获得所需的输出。稍后我可以从查询(select max(rowid) from maxID)

中获取此信息

如果我只想查看最后一条记录A003,请建议我需要做什么。

感谢您的时间。

更新

我的表中已有数百万个数据,因此无法按照以下建议在其中添加新列。

5 个答案:

答案 0 :(得分:5)

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

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)

Demo

<强>更新

牦牛是对的。我的解决方案不是确定性的。也许它适用于少量记录。我发现SELECT语句的默认排序(here for example)有大量的post abount不可靠性。 后续步骤:

  • 在哪些条件下,默认的SELECT排序与插入顺序匹配?
  • 是否可以在没有增量ID或插入时间戳的表中获取最后插入的记录?

我知道这不是答案,但说明问题会限制问题。

答案 1 :(得分:2)

从插入脚本中,A004不是最后插入的记录。这是第三个。如果您想按字母顺序获取最后一条记录(A004是),则必须使用

select myID from maxID order by myID desc limit 1

如果您想要最后插入的行,为什么不使用向表中添加自动增量列?这就是那些列的重点。自动增量列不必是PK(它应该是,但如果您没有选择则不必)。

答案 2 :(得分:2)

似乎SELECT无法保证以任何特定顺序返回行(当然,不使用ORDER BY子句。)

根据SQL-92 standard(第373页):

  

如果&lt;按条款订购&gt;未指定,则由&lt;指定的表指定。光标指定&gt;是T,T中行的顺序依赖于实现。

好的,MySQL并不完全符合SQL-92标准,但这是一个严肃的提示。

Laurynas Biveinis(显然affiliated with Perconaalso states

  

由于月相,没有ORDER BY子句(...)的行的顺序可能会有所不同,这是正常的。

关于InnoDB的MySQL manual说:

  

InnoDB总是根据 [a PRIMARY KEYNOT NULL UNIQUE索引] 订购表格行(如果有的话)。

就我而言,我假设 MySQL也可以在OPTIMIZE TABLE后重新排序行,或者甚至在多次删除和插入后重复使用空格(我有tried to find an example这个,到目前为止都失败了。)

鉴于你的表格结构,不幸的是,底线是如此多的因素可能改变了行的顺序;我看不到可靠地确定插入顺序的解决方案。除非你创建表后保留了所有二进制日志,当然;)

尽管如此,您可能仍希望在表格中添加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

答案 3 :(得分:1)

MySQL help for last_insert_id中所述,您只能将其与**自动增量列一起使用。这意味着您无法让MySQL找到最近插入的行,除非您了解ID的顺序。如果按照您的示例建议对它们进行排序,则可以使用

SELECT *
FROM maxID
WHERE myId = max(myId)

但我建议在表格中添加auto-increment column,然后在= last_insert_id()子句中使用WHERE。有关如何获取最后一个ID的信息,另请参阅this page

答案 4 :(得分:-1)

请使用以下查询。

Select * from maxID order by myId desc limit 1,1;