mySQL - 在添加主键列之前根据需要排序表

时间:2009-08-27 13:47:35

标签: mysql

使用以下表示法将主键添加到表中:

ALTER TABLE tablename ADD id INT(11)NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST

这样可以正常工作,但在添加此主键之前,似乎默认表的顺序为行的原始输入顺序。这对目前的情况来说并不理想。

这个表的顺序很重要,因为它代表了一个菜单结构,我需要在将主键添加到表之前,由parentId对表进行排序,如下所示:

+ ------ + ---------- + --------------------------- <登记/> | id | parentId | ...
+ ------ + ---------- + ---------------------------
| 1 | 1 | ...
+ ------ + ---------- + ---------------------------
| 2 | 1 | ...
+ ------ + ---------- + ---------------------------
| 3 | 2 | ...
+ ------ + ---------- + ---------------------------
| 4 | 2 | ...
+ ------ + ---------- + ---------------------------
| 5 | 2 | ...
+ ------ + ---------- + ---------------------------
。 。

这是在添加主键列“id”后表格的外观,但是目前我似乎无法在添加id列之前通过parentId对表进行排序。

我一直在尝试上述查询的变体,例如:

ALTER TABLE tablename ADD id INT(11)NOT NULL AUTO_INCREMENT由parentId ASC开始的主要第一顺序

但没有成功。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

AUTO_INCREMENT列不一定符合任何特定顺序 - 它只是任意整数。例如,当您向菜单添加一些新项目时,将会发生什么?它将“属于”表格中间,但其AUTO_INCREMENT值将是新分配的值,不受当前订购的限制。

不要担心AUTO_INCREMENT值的顺序,只需在从表中选择数据时应用正确的ORDER BY子句:

SELECT *
FROM tablename
ORDER BY parentId ASC;

即使使用一个AUTO_INCREMENT列,您也必须应用ORDER BY子句来确保结果的顺序,因此您也可以使用具有最大语义意义的子句。

答案 1 :(得分:1)

一种方法是使用主键创建一个新表,然后执行INSERT INTO newTable SELECT * FROM oldTable ORDER BY parentID。然后你可以删除旧表,并重命名newTable。

答案 2 :(得分:0)

由于您在该列中有重复项,因此按ParentId排序可能不起作用 - 例如,它如何知道要排序的第1行和第2行?

你可以添加另一列,SortOrder并按顺序排序吗?