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)


Мога ли да попитам защо искате да направите това?

Ако някой промени някоя от стойностите на името или вмъкне нови редове, това ще обърка вашата схема за подреждане. Опитът да се съхрани някакво значение в подреждането на PK, който вече е наличен другаде в таблицата (колоната с име), изглежда излишен и следователно е лоша идея.

Много по-добро решение е да не се притеснявате за стойността на колоната ID и просто да сортирате по колоната име, когато използвате данните в приложението си.

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

person JohnFx    schedule 05.12.2009
comment
Това е добра точка. Ако имате нужда от уникален номер, който съответства на сортираната стойност на всеки низ, можете да добавите допълнителна колона и да актуализирате, ако е необходимо. Пренареждането на ID ще счупи нещата, ако ID се използва като външен ключ в друга таблица. - 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
една корекция, ще трябва да премахнете PK от таблица 2, преди да вмъкнете от таблица 1; след това не избирайте *, но изберете всички колони с изключение на ID. и ще работи като чар - person Zalaboza; 23.09.2014

Можете да SELECT INTO a нова таблица от старата таблица, подреждайки вашия избор по желание. Имайте ИД с автоматично нарастване в новата таблица. Ако е необходимо, премахнете старата таблица и преименувайте новата таблица.

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