一尘不染

从mysql获取最后一条记录

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,我得到如下输出

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

谢谢你的时间。

更新:

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


阅读 939

收藏
2020-05-17

共1个答案

一尘不染

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

根据SQL-92标准(第373页):

如果未指定,则指定的表为T,并且T中的行顺序与实现有关。

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

Laurynas
Biveinis(显然隶属于Percona还指出

ORDER BY由于月相的原因,没有子句(…)的行的顺序可能会有所不同,这是可以的。

MySQL手册说,大约InnoDB的:

如果存在,InnoDB总是根据 _[aPRIMARY 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

2020-05-17