我有mysql表,如下所示
id,sort,enabled,font,store
1,1,1,Adlib,0
2,2,1,Arial,0
3,3,1,"Arial Bold",0
4,4,1,"Arial Black",0
----------
----------
40,40,1,Harlow,0
41,41,1,"Hobby Headline",0
42,42,1,"Hobby Horse",0
----------
----------
85,85,1,"Wild West",0
86,86,1,"Zap Chance",0
87,87,1,Helvetica,0id列是主键。如果我添加了一个新的字体条目,它将存储在表的最后一行中。
如何重新排序字体列值,它们按名称的升序排列?
注意:我不需要select语句,我希望重新排序表本身中的数据。
Update:如果在MySQL中不可能(我只是好奇地想知道),我可以在显示数据时使用替代方法解决问题。谢谢你帮忙。
发布于 2018-09-06 10:48:41
我想重新排序表本身中的数据
表中存在的唯一实际物理顺序是磁盘上的群集主键。这将是id列,而不是字体名称。但是,在任何情况下,通常您都应该在SQL级别进行操作,假设表是按照无序的记录集建模的。
因此,如果希望字体列按特定方式排序,则应使用ORDER BY
SELECT *
FROM yourTable
ORDER BY font;我应该补充一点,如果您想要一个可以快速按字体名称搜索表的结构,那么您可以在该列上添加一个索引。然后,就会有一个按字体排序的物理结构,但它不是你的实际表格,而是一棵B树。
发布于 2018-09-06 11:03:07
我在MySQL中学到的一件事是,任何没有相对直截了当和有文档可循的方法的东西,都是没有理由的。
在MySQL中没有这样的东西。尽管如此,您可以花费大量资源并强制执行此操作(请记住,它可能会扰乱您的索引,当然也会破坏您的主键,因此您拥有的任何依赖于表的应用程序都会意外地运行),方法是拥有一个进程(存储过程、任何编程语言中的脚本等):
order by子句对其进行排序。insert将临时表转储到最近截断的原始表中。虽然这样做是可行的,但绝对不可取。而且它又乱又贵。没有真正的理由去做这样的事情。最好对表进行适当的索引,并在查询时进行排序。
发布于 2018-09-06 11:50:10
存储在磁盘上的行的顺序由主键决定,至少对于InnoDB是这样。
InnoDB表将您的数据安排在磁盘上,以便根据主键优化查询。
当您将主键从Id列移动到字体名称列时,行将按字体名称列排序:
CREATE TABLE foobar(Id INT PRIMARY KEY, Name VARCHAR(30));
INSERT INTO foobar(Id, Name) VALUES (1, 'middle');
INSERT INTO foobar(Id, Name) VALUES (3, 'east');
INSERT INTO foobar(Id, Name) VALUES (5, 'west');
INSERT INTO foobar(Id, Name) VALUES (7, 'up');
INSERT INTO foobar(Id, Name) VALUES (2, 'down');
INSERT INTO foobar(Id, Name) VALUES (4, 'left');
INSERT INTO foobar(Id, Name) VALUES (6, 'right');
SELECT * FROM foobar;
+----+--------+
| Id | Name |
+----+--------+
| 1 | middle |
| 2 | down |
| 3 | east |
| 4 | left |
| 5 | west |
| 6 | right |
| 7 | up |
+----+--------+
ALTER TABLE foobar DROP PRIMARY KEY;
ALTER TABLE foobar ADD PRIMARY KEY(Name);
SELECT * FROM foobar;
+----+--------+
| Id | Name |
+----+--------+
| 2 | down |
| 3 | east |
| 4 | left |
| 1 | middle |
| 6 | right |
| 7 | up |
| 5 | west |
+----+--------+https://stackoverflow.com/questions/52202322
复制相似问题