我正在使用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
,请建议我需要做什么。
感谢您的时间。
答案 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)
<强>更新强>
牦牛是对的。我的解决方案不是确定性的。也许它适用于少量记录。我发现SELECT语句的默认排序(here for example)有大量的post abount不可靠性。 后续步骤:
我知道这不是答案,但说明问题会限制问题。
答案 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 Percona)also states:
由于月相,没有
ORDER BY
子句(...)的行的顺序可能会有所不同,这是正常的。
关于InnoDB的MySQL manual说:
InnoDB总是根据 [a
PRIMARY KEY
或NOT 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;
答案 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;