我正在运行MySQL 5.5并发现以前我不知道的行为。
鉴于此创造:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name_UQ` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
使用这些插页:
insert into test (name) values ('b');
insert into test (name) values ('a');
这个选择:
select * from test;
MySQL做了我不知道的事情:
2 a
1 b
自动排序。
给定一个包含一个额外的非唯一列的表:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(128) DEFAULT NULL,
`other_column` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name_UQ` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
相同的插入(见上文),select(见上文)给出了这个结果:
1 b NULL
2 a NULL
这是预期的。
第一个查询(SQL Fiddle)的行为记录在哪里?我想看到更多这些奇特的东西。
答案 0 :(得分:1)
MySQL 不自动排序结果集。除非查询指定order by
子句,否则结果集的排序是不确定的。
你永远不应该依赖任何形式的“隐含”排序。只是因为你在1(或100个查询)中看到它。事实上,如果没有order by
,相同的查询可以在后续运行中以不同的顺序返回结果(虽然我承认这经常发生在其他数据库中,但在MySQL中不太可能。)
而是添加ORDER BY
。通过主键排序非常有效,因此您不必担心性能。