我已经创建了两个表并插入了如下所示的值。
表1

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');

表2
create table maxID2 (myID varchar(4) PRIMARY KEY);

insert into maxID2 values ('A001');
insert into maxID2 values ('A002');
insert into maxID2 values ('A004');
insert into maxID2 values ('A003');

当我执行查询时
SELECT myId, @rowid:=@rowid+1 as myrow
FROM maxID, (SELECT @rowid:=0) as init
ORDER BY myrow desc
LIMIT 1;

输出为
+++++++++++++
myid + myrow
+++++++++++++
A003 + 4
+++++++++++++


当我执行查询时
SELECT myId, @rowid:=@rowid+1 as myrow
FROM maxID2, (SELECT @rowid:=0) as init
ORDER BY myrow desc
LIMIT 1;

输出为
+++++++++++++
myid + myrow
+++++++++++++
A004 + 4
+++++++++++++

两个表之间的区别是,在第二个表中,我的id是PRIMARY KEY
您可以在www.sqlfiddle.com查看以上数据/结果。
我的问题是
为什么查询相同时得到两个不同的结果?
注意:这个问题和我以前的问题有点关系,我几乎得到了答案,yak告诉我行的顺序没有保证。:(

最佳答案

这是因为当选定的字段集完全包含在给定的索引字段集中时,此索引用于检索数据而不是完整扫描结果。
由于索引有一个默认的排序顺序,当原始表数据不存在时,因此使用索引提取的数据出现的顺序与从完整表扫描中提取的数据出现的顺序不同。
在您的例子中,当您使用主键时,第4行确实是第4行,因为mysql(oracle,sql server…)内部是这样组织的,以便更快地查找数据。
请注意,偶然的情况下,您可能在两个查询中都获得了相同的结果,这仅仅是因为默认的所选结果顺序确实与插入的顺序不相关。
最后,我警告您,如果您计划在mysql中添加一个具有特定顺序的索引(如所述的here),以便在例如desc order中检索行,那么您不能这样做,因为这在mysql中还不是一个允许的功能:
索引名称规范可以以asc或desc结尾。
允许在以后的扩展中使用关键字来指定升序
或递减索引值存储。目前,它们被解析,但是
忽略;索引值始终按升序存储。

07-24 09:37
查看更多