3

我正在使用 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

谢谢你的时间。

更新:

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

4

6 回答 6

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)

演示

更新

牦牛是对的。我的解决方案不是确定性的。也许它适用于少量记录。我发现大量的 SELECT 语句的默认排序不可靠(例如这里)。下一步:

  • 在什么情况下默认的 SELECT 排序匹配插入顺序?
  • 是否可以在没有增量 id 或插入时间戳的情况下获取表中最后插入的记录?

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

于 2012-06-19T15:55:37.730 回答
2

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

select myID from maxID order by myID desc limit 1

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

于 2012-01-19T09:07:23.090 回答
2

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

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

如果未指定<order by 子句>,则<cursor specification> 指定的表为T,并且T 中的行顺序取决于实现。

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

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

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

MySQL 手册中提到了 InnoDB:

如果存在的话,InnoDB 总是根据[a PRIMARY KEYor NOT NULL UNIQUEindex]对表行进行排序。

就我而言,我认为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

于 2012-06-21T01:09:25.873 回答
1

MySQL 帮助中last_insert_id所述,您只能将其与 **auto-increment 列一起使用。这意味着您无法让 MySQL 为您找到最近插入的行,除非您对 ID 的顺序有所了解。如果它们按照您的示例进行排序,那么您可以使用

SELECT *
FROM maxID
WHERE myId = max(myId)

但我建议在表中添加一个自动增量列,然后= last_insert_id()在您的WHERE子句中使用。有关如何获取最后一个 ID 的信息,另请参阅此页面。

于 2012-01-19T09:02:18.573 回答
0

last_insert_id 不起作用,因为它只返回自动增量字段生成的最后一个值。但是,我认为该解决方案可能在正确的轨道上。我建议添加另一列是自动递增整数。然后您可以插入数据并检索刚刚插入的行,选择 last_insert_id()。要检索最近的行(由任何进程插入),请选择新列的最大数量,或按其降序排序。

如果您想使用 varchar 列,您可以进行字母排序,但这并不能保证它将是您插入的最后一行,甚至是最近插入的行。

我能想到的另一种解决方案可能会满足您的需求,它是创建一个存储过程,该过程创建行,将其插入表中,然后将其返回给您。

您对@rowid 的使用只是计算返回给您的订单行。无法保证它们会按照从旧到新的顺序退还给您。有多种因素会影响行的存储顺序。

于 2012-01-19T09:11:52.527 回答
-1

请使用以下查询。

Select * from maxID order by myId desc limit 1,1;
于 2012-01-19T09:30:58.193 回答