使用以下表示法将主键添加到表中:
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开始的主要第一顺序
但没有成功。
有什么建议吗?
答案 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并按顺序排序吗?