【问题标题】:Resort MySQL Table by Column Alphabetically按字母顺序排列 MySQL 表
【发布时间】:2013-02-12 19:00:34
【问题描述】:

我有一个包含应用程序设置的表格,其中包含以下列:idkeyvalue

id 列是自动递增的,但截至目前,我不使用它,也没有任何外键约束。我正在填充设置并希望对其进行重组,使其按字母顺序排列,因为我没有以这种方式放置设置,但按字母顺序重新排序有助于将相关设置组合在一起。

例如,如果我有以下设置:

ID     KEY             VALUE
======================================
1      App.Name        MyApplication
2      Text.Title      Title of My App
3      App.Version     0.1

我希望将所有 App.* 设置按顺序组合在一起,而不必每次都执行 ORDER BY。无论如何,这就是解释。我有tried the following,它似乎没有改变顺序:

CREATE TABLE mydb.Settings2 LIKE mydb.Settings;
INSERT INTO mydb.Settings2 SELECT `key`,`value` FROM mydb.Settings ORDER BY `key` ASC;
DROP TABLE mydb.Settings;
RENAME TABLE mydb.Settings2 TO mydb.Settings;

这将按照建议复制表格,但不会重组数据。我在这里想念什么?

【问题讨论】:

标签: mysql


【解决方案1】:

重新排序表格的简单方法是使用ALTER TABLE table ORDER BY column ASC。您尝试的查询看起来应该有效,但我知道 ALTER TABLE 查询有效;我经常使用它。

注意:重新排序表中的数据仅在 MyISAM 表中有效且有意义。 InnoDB 始终以 PRIMARY KEY 顺序存储数据,因此无法重新排列。

【讨论】:

  • 您的回答帮助我全面了解它的工作方式。我认为我在上面做SELECT key,value FROM... 的最初尝试需要改为SELECT '' AS id, key, value FROM...,这会强制它生成一个新的自动增量ID,而不是使用前一个。感谢您的帮助!
  • @cilosis 这只会工作一次。在您插入一堆新设置后,它们将再次出现故障。要获得长期效果,您需要使用key 列作为PRIMARY KEY 重新创建设置表。因为正如 G-Nugget 所说,InnoDB 总是以 PRIMARY KEY 顺序存储数据。这样在插入新记录后您的订单就会完好无损。
  • @peterm 好的,这很有意义。
【解决方案2】:

决定回答这个问题。

正如我在对最初答案的评论中所说,为了获得长期效果,您需要重新创建设置表,并将键列作为主键。因为正如 G-Nugget 所说的那样,“InnoDB 总是以 PRIMARY KEY 顺序存储数据”。

你可以这样做

CREATE TABLE settings2
    (`id` int NULL, `key` varchar(64), `value` varchar(64), PRIMARY KEY(`key`));
INSERT INTO settings2 
SELECT id, `key`, `value` 
  FROM settings;
DROP TABLE settings;
RENAME TABLE settings2 TO settings;

这样在插入新记录后您的订单就会完好无损。

如果您不需要 settings 表中的初始 id 列,那么现在是放弃它的好时机。

这里正在工作sqlfiddle

免责声明:我个人还是会使用ORDER BY

【讨论】:

  • 酷,我喜欢 SQL Fiddle...还没见过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多