如果您使用 InnoDB 表,它们总是按主键顺序存储。因此,如果您SELECT
从表中未指定任何其他ORDER BY
,那么您将按该顺序排列行。
错误代码:1075 表定义不正确;只能有一个自动列,它必须定义为一个键 ==> 似乎谎言我不能删除主键,为什么?– 达米安
InnoDB 要求如果你有一个 AUTO_INCREMENT 列,它必须是索引中的第一列。通常人们将它定义为主键索引,但如果你删除主键,你至少必须为它定义一个不同的索引。
示例:创建一个具有自增主键的测试表。
mysql> create table record_table (id int auto_increment primary key);
mysql> insert into record_table values (1), (2), (3);
不允许有不属于任何键的自动增量列。
mysql> alter table record_table drop primary key;
ERROR 1075 (42000): Incorrect table definition;
there can be only one auto column and it must be defined as a key
如果我们删除主键但在同一列上添加辅助键,这满足 InnoDB。
mysql> alter table record_table drop primary key, add key (id);
Query OK, 3 rows affected (0.13 sec)
但是如果我们试图使该列没有键,那也是一个错误。
mysql> alter table record_table drop key id;
ERROR 1075 (42000): Incorrect table definition;
there can be only one auto column and it must be defined as a key
一种解决方法是在表中创建一个额外的列并为其分配随机值,然后您可以按该列排序。
mysql> alter table record_table add column sort float;
mysql> update record_table set sort = rand();
mysql> select * from record_table ;
+----+----------+
| id | sort |
+----+----------+
| 1 | 0.439593 |
| 2 | 0.416936 |
| 3 | 0.7659 |
+----+----------+
mysql> select * from record_table order by sort;
+----+----------+
| id | sort |
+----+----------+
| 2 | 0.416936 |
| 1 | 0.439593 |
| 3 | 0.7659 |
+----+----------+
您可以“重新洗牌”表,而无需来回复制数据,只需更新随机值。
mysql> update record_table set sort = rand();
mysql> select * from record_table order by sort;
+----+----------+
| id | sort |
+----+----------+
| 1 | 0.137319 |
| 3 | 0.329505 |
| 2 | 0.348292 |
+----+----------+