MYSQL: как изменить порядок таблицы

У меня есть таблица, подобная следующей,

| id  | name   | color  |
------+--------+---------
| 1   | pear   | green  |
| 2   | apple  | red    |
| 3   | banana | yellow |
| 4   | grape  | purple |

Я хотел бы изменить порядок в алфавитном порядке, используя столбец «имя», и сбросить идентификатор (автоинкремент) с этим новым порядком, чтобы получить следующее

| id  | name   | color  |
------+--------+---------
| 1   | apple  | red    |
| 2   | banana | yellow |
| 3   | grape  | purple |
| 4   | pear   | green  |

ВОПРОС: как я могу сделать это с помощью MYSQL?


person cardflopper    schedule 05.12.2009    source источник
comment
Почему вы хотите, чтобы порядок идентификаторов соответствовал порядку имен?   -  person Jeremy Raymond    schedule 05.12.2009


Ответы (5)


Могу я спросить, почему вы хотите это сделать?

Если кто-то изменит любое из значений имени или вставит новые строки, это испортит вашу схему упорядочения. Попытка сохранить какое-то значение в порядке ПК, который уже доступен в другом месте таблицы (столбец имени), кажется избыточной и, следовательно, плохой идеей.

Гораздо лучшее решение — не беспокоиться о значении столбца идентификатора и просто сортировать по столбцу имени, когда вы используете данные в своем приложении.

PS: извините за ответ без ответа. Обычно я бы предположил, что у вас есть веская причина, и просто дал бы ответ, который непосредственно касается того, что вы пытаетесь сделать, но я заметил из ваших других вопросов, что вы все еще находитесь на ранних этапах изучения дизайна базы данных, поэтому я хотел помочь указать вам правильное направление вместо того, чтобы способствовать вашему продвижению к опрометчивому подходу.

person JohnFx    schedule 05.12.2009
comment
Это хороший момент. Если вам нужен уникальный номер, соответствующий отсортированному значению каждой строки, вы можете добавить дополнительный столбец и обновить его по мере необходимости. Изменение порядка идентификатора приведет к серьезной поломке, если идентификатор используется в качестве внешнего ключа в другой таблице. - person Eric J.; 05.12.2009
comment
Единственный раз, когда я предлагаю добавить дополнительный столбец для сортировки, — это когда сортировка не может быть определена другими столбцами в таблице. Например, если приложение позволяет пользователям произвольно изменять порядок элементов. - person JohnFx; 05.12.2009
comment
Записи образуют набор. Наборы не должны быть заказаны в определенном порядке. Напомним, что теория реляционных баз данных основана на чисто математических понятиях. Если вам нужен определенный порядок в вашем приложении, добавьте предложение orderby, в противном случае план выполнения будет решать, как извлекать данные и, следовательно, порядок; эти планы могут меняться со временем. Более того, помните, что суррогатные ключи не имеют смысла для конечного пользователя. - person lmsasu; 05.12.2009
comment
Если вы добавите дополнительный столбец или сохраните только столбец id, убедитесь, что вы добавили соответствующие индексы для этих столбцов, иначе после того, как таблица станет слишком большой, вы не сможете эффективно искать ее. - person Geek Num 88; 27.05.2010

Самый простой способ сбросить автоматическое увеличение — создать другую таблицу.

MySQL предоставляет полезные команды, такие как CREATE TABLE LIKE и RENAME TABLE.

CREATE TABLE table2 LIKE table1;

INSERT INTO table2
  SELECT * FROM table1 ORDER BY name;

DROP TABLE table1;

RENAME TABLE table2 TO table1;
person Yada    schedule 05.12.2009
comment
Это неверно. Вы не можете выбрать все (SELECT * FROM table1), потому что, если вы сделаете это, вы также скопируете PK с той же ассоциацией, что и с информацией о строке. Что оставит вас с той же точной таблицей с тем же именем и цветом, связанным с одним и тем же идентификатором, но с другим порядком. - person Mohammed Joraid; 18.04.2014
comment
одно исправление, вам нужно будет удалить ПК из таблицы 2, прежде чем вставлять из таблицы 1; тогда не делайте select * , но выберите все столбцы, кроме ID. и это будет работать как шарм - person Zalaboza; 23.09.2014

Вы можете ВЫБРАТЬ В новую таблицу из старой таблицы, упорядочивая ваш выбор по желанию. Иметь идентификатор автоинкремента в новой таблице. При необходимости удалите старую таблицу и переименуйте новую.

person Eric J.    schedule 05.12.2009

Почему бы не добавить «ORDER BY name ASC» в конце вашего запроса? Я предполагаю, что вам нужен идентификатор по какой-то причине.

person ademers    schedule 05.12.2009

 SELECT
       RANK() Over (ORDER BY Name) As NewID
     , Name
     , Color

 FROM Fruits

можно сохранить во временную таблицу, затем обрезать, затем обрезать таблицу фруктов и вставить, но это, вероятно, дрянное решение.

person Paul Creasey    schedule 05.12.2009
comment
MySQL не поддерживает оконные функции. - person Vladislav Rastrusny; 04.07.2014
comment
это очень близко, но как теперь сохранить NewID в id? - person ; 01.12.2018