mySQL - Ordering table as desired, before Adding Primary Key column

Asked
Viewd396

0

Am using the following notation to add a primary key to a table:

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

And this works fine, but it seems to default the order of the table to the original input order of the rows, before adding this primary key. And this is not ideal for the current situation.

The order of this table is important, as it represents a menu structure, and I need the table to be ordered by parentId, as follows, before the primary key is added to the table:

+------+----------+---------------------------
| id | parentId | ...
+------+----------+---------------------------
| 1 | 1 | ...
+------+----------+---------------------------
| 2 | 1 | ...
+------+----------+---------------------------
| 3 | 2 | ...
+------+----------+---------------------------
| 4 | 2 | ...
+------+----------+---------------------------
| 5 | 2 | ...
+------+----------+---------------------------
. . .

This is how the table should look after the adding of the primary key column "id", but currently I can not seem to order the table by parentId before the id column is added.

I have been trying variations of the above query such as:

ALTER TABLE tablename ADD id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ORDER BY parentId ASC

but with no success.

Any suggestions??

3 ответов

3

Столбец AUTO_INCREMENT не обязательно должен соответствовать какому-либо определенному порядку - это просто произвольные целые числа. Что произойдет в будущем, например, когда вы добавите новый пункт в меню? Он будет «принадлежать» середине таблицы, но его значение AUTO_INCREMENT будет новым присвоенным значением, не зависящим от вашего текущего порядка.

Вместо того, чтобы беспокоиться о порядке значений AUTO_INCREMENT, просто примените правильное предложение ORDER BY при выборе данных из своей таблицы:

 SELECT *
FROM tablename
ORDER BY parentId ASC;
 

Даже с столбцом AUTO_INCREMENT вы должны применить предложение ORDER BY, чтобы обеспечить порядок результатов, поэтому вы также можете использовать тот, который имеет наибольший семантический смысл.

0

Ordering by ParentId might not work since you have duplicates in that column - for example how would it know which of rows 1 and 2 to sort by?

Could you add another column, SortOrder and order by that?

1

One way would be to create a new table with the primary key, then do an INSERT INTO newTable SELECT * FROM oldTable ORDER BY parentID. Then you can drop the old table, and rename the newTable.