5

我创建了两个表和插入的值,如下所示。

表格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
+++++++++++++

两个表之间的区别在于,在第二个表中我的 myID 为PRIMARY KEY.

您可以在www.sqlfiddle.com查看上述数据/结果。

我的问题是

为什么当查询相同时我得到两个不同的结果?

注意:这个问题与我的老问题Getting last record from mysql有点相关,我几乎得到了答案,Yak 告诉我行的顺序不能保证。:(

4

2 回答 2

7

这是因为当所选的字段集完全包括在给定的索引字段集中时,该索引用于检索数据而不是FullScan结果。

由于索引具有默认排序顺序,当原始表数据没有时,使用索引提取的数据因此以不同于来自全表扫描的顺序出现。

在您的情况下,当您使用主键时,第 4 行确实是第 4 行,因为内部 mysql(oracle,sql server ...)以这种方式组织它以更快地查找数据。

请注意,偶然地,您可能在两个查询中都获得了相同的结果,只是因为没有证明默认选择的结果顺序确实与插入的顺序相关。

最后,让我警告您,如果您计划在 mysql 中添加具有特定顺序的索引(例如此处描述的),以便以 DESC 顺序检索行,您不能这样做,因为它不是mysql中允许的功能:

index_col_name 规范可以以 ASC 或 DESC 结尾。这些关键字被允许用于指定升序或降序索引值存储的未来扩展。目前,它们被解析但被忽略;索引值始终按升序存储。

于 2012-06-20T18:04:55.837 回答
4

Primary keys are returned in sorted order by default

这就是为什么您会为两个查询获得不同的输出。

您也可以查看另一个示例:here is the example

于 2012-06-20T18:18:51.367 回答