2009-12-05 23 views
5

Ho una tabella come la seguente,MYSQL: come "riordinare" un tavolo

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

vorrei riordinare in ordine alfabetico utilizzando la colonna "nome" e reimpostare l'ID (autoincrement) con questo nuovo per finire con la seguente

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

DOMANDA: come posso fare questo con MySQL?

+3

Perché si desidera che l'ordine id corrisponda all'ordine dei nomi? –

risposta

9

Posso chiederti perché vorresti farlo?

Se qualcuno modifica uno dei valori del nome o inserisce nuove righe, rovinerà lo schema di ordinazione. Cercare di memorizzare un significato nell'ordinamento del PK che è già disponibile altrove nella tabella (la colonna del nome) sembra ridondante e, di conseguenza, una cattiva idea.

Una soluzione molto migliore non è preoccuparsi del valore della colonna ID e basta ordinare sulla colonna del nome quando si utilizzano i dati nella vostra app.

PS: Ci scusiamo per la risposta di tipo non risposta. Normalmente assumerei che tu avessi una buona ragione e ti do una risposta che si rivolge direttamente a quello che stai cercando di fare, ma ho notato dalle tue altre domande che sei ancora nelle prime fasi di apprendimento sulla progettazione del database, quindi volevo aiutare indirizzarti nella giusta direzione invece di aiutare i tuoi progressi verso un approccio sconsiderato.

+1

Questo è un buon punto. Se è necessario un numero univoco che corrisponda al valore ordinato di ciascuna stringa, è possibile aggiungere una colonna aggiuntiva e aggiornarla secondo necessità. Il riordino dell'ID si romperà gravemente se l'ID viene utilizzato come chiave esterna in un'altra tabella. –

+0

L'unica volta che suggerirei di aggiungere una colonna aggiuntiva per l'ordinamento sarebbe quando l'ordinamento non può essere determinato da altre colonne nella tabella. Ad esempio, se l'applicazione consente agli utenti di riordinare gli articoli in modo arbitrario. – JohnFx

+1

I record formano un insieme. I set non dovrebbero essere ordinati in un ordine specifico. Ricordiamo che una teoria del database relazionale è basata su pure nozioni matematiche. Se si desidera un ordine specifico nella propria applicazione, aggiungere una clausola orderby, altrimenti il ​​piano di esecuzione deciderà come recuperare i dati e quindi l'ordine; questi piani possono cambiare nel tempo. Inoltre, ricorda che le chiavi surrogate sono prive di significato per l'utente finale. – lmsasu

2

Perché non aggiungere "ORDER BY nome ASC" alla fine della query? La mia ipotesi sarebbe che hai bisogno dell'ID per qualche motivo.

7

È possibile SELECT INTO una nuova tabella dalla vecchia tabella, ordinando la selezione in come desiderato. Avere un ID autoincremento nella nuova tabella. Se necessario, rilascia la vecchia tabella e rinomina la nuova tabella.

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

FROM Fruits 

potrebbe risparmiare ad una tabella temporanea poi tronca poi troncare la tabella di frutta e l'inserto, ma è probabilmente una soluzione scadente.

+0

MySQL non supporta le funzioni con finestra. –

13

Il modo più semplice per reimpostare l'incremento automatico è creare un'altra tabella.

MySQL fornisce comandi come CREATE TABLE LIKE e RENAME TABLE utili.

CREATE TABLE table2 LIKE table1; 

INSERT INTO table2 
    SELECT * FROM table1 ORDER BY name; 

DROP TABLE table1; 

RENAME TABLE table2 TO table1; 
+0

Questo è sbagliato. Non è possibile selezionare tutto (SELECT * FROM table1), perché se lo si fa, si copierà anche il PK con la stessa associazione che ha con le informazioni sulla riga. Che ti lascerà con la stessa tabella esatta con lo stesso nome e il medesimo colore legati allo stesso id, ma con un diverso ordine. – MJoraid

+0

una correzione, sarà necessario eliminare PK dalla tabella 2 prima di inserire da tabella1; quindi non selezionare *, ma selezionare tutte le colonne tranne ID. e funzionerà come fascino – Zalaboza