MySQL自动对表中的一个唯一列进行排序。这记录在哪里?

时间:2017-01-13 13:28:49

标签: mysql sql database

我正在运行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)的行为记录在哪里?我想看到更多这些奇特的东西。

1 个答案:

答案 0 :(得分:1)

MySQL 自动排序结果集。除非查询指定order by子句,否则结果集的排序是不确定的

你永远不应该依赖任何形式的“隐含”排序。只是因为你在1(或100个查询)中看到它。事实上,如果没有order by,相同的查询可以在后续运行中以不同的顺序返回结果(虽然我承认这经常发生在其他数据库中,但在MySQL中不太可能。)

而是添加ORDER BY。通过主键排序非常有效,因此您不必担心性能。