PDA

View Full Version : [SQL] Ordinamento valori tabelle nei backup


Andrea16v
11-03-2007, 21:15
Ho l'esigenza di ordinare le tuple di una tabella in base a diversi campi (2chiavi primarie), in modo che il backup risulti ordinato, non mi serve ovviamente la query per visualizzarle ordinate (select * from tabella order by ...).
Esempio di backup:


def. tabella

bla bla bla

INSERT INTO `tabella` (`PRIMARY_KEY_1`,`PRIMARY_KEY_2`, ...)
VALUES
(1,1, ... ),
(1,4, ... ),
(2,2, ... ),
(2,4, ... ),
(1,2, ... ),
(2,3, ... ),
(1,3, ... ),
(2,1, ... )
ecc ecc


Vorrei che nel file di backup generato da MySqlAdministrator venissero ordinate in base alla primary_key1 e successivamente alla primary_key2. Di default le ordina in base alla sequenza di inserimento, quindi alcune tuple mi risultano fuori sequenza (vedi sopra) e devo intervenire manualmente sul bakcup, per poi rifare il restore.. :cry:

texerasmo
12-03-2007, 11:16
non ho capito molto...
cmq
no non puoi crearti un vista oppure una tabella temporanea con ordinamento che vuoi tu e poi da li farci quello che vuoi?

Andrea16v
12-03-2007, 19:20
Mi serve proprio che quando importo dal backup le tuple compaiano nelle tabelle con l'ordinamento di cui sopra, ma andrebbe bene anche il contrario, ossia riuscire a creare il backup da tabelle già ordinate in base alle chiavi primarie.
Sopra lo ho dato per scontato, ma da quello che ho ora nel file di backup, ossia:

def. tabella

bla bla bla

INSERT INTO `tabella` (`PRIMARY_KEY_1`,`PRIMARY_KEY_2`, ...)
VALUES
(1,1, ... ),
(1,4, ... ),
(2,2, ... ),
(2,4, ... ),
(1,2, ... ),
(2,3, ... ),
(1,3, ... ),
(2,1, ... )
ecc ecc



vorrei ottenere questo:

def. tabella

bla bla bla

INSERT INTO `tabella` (`PRIMARY_KEY_1`,`PRIMARY_KEY_2`, ...)
VALUES
(1,1, ... ),
(1,2, ... ),
(1,3, ... ),
(1,4, ... ),
(2,1, ... ),
(2,2, ... ),
(2,3, ... ),
(2,4, ... )
ecc ecc

shinya
12-03-2007, 19:29
Premesso che una tabella è un insieme di ennuple, e in matematica un insieme non ha ordinamento, e quindi non capisco le motivazioni del tuo problema, puoi crearti una tabella al volo ed esportare quella.
In oracle sarebbe qualcosa tipo:


create table t as
select * from my_table order by 1,2 /* ammesso che siano i primi due i campi per cui vuoi ordinare */


Il problema però ti salterà fuori al prossimo backup, perchè i dati potrebbero (anzi, molto probabilmente non lo saranno) essere nell'ordite voluto.

Scusa ma che ti cambia avere le insert in un certo ordine?? Una tabella è un insieme di dati, per aver un ordinamento c'è l'order by apposta!

Andrea16v
12-03-2007, 22:21
Premesso che una tabella è un insieme di ennuple, e in matematica un insieme non ha ordinamento, e quindi non capisco le motivazioni del tuo problema, puoi crearti una tabella al volo ed esportare quella.
In oracle sarebbe qualcosa tipo:


create table t as
select * from my_table order by 1,2 /* ammesso che siano i primi due i campi per cui vuoi ordinare */


Il problema però ti salterà fuori al prossimo backup, perchè i dati potrebbero (anzi, molto probabilmente non lo saranno) essere nell'ordite voluto.

Scusa ma che ti cambia avere le insert in un certo ordine?? Una tabella è un insieme di dati, per aver un ordinamento c'è l'order by apposta!

La tua domanda è legittima, ti spiego: il database all'inizio era stato pensato per avere un ordinamento naturale delle tuple (che è quello che voglio ricreare) in quanto gli inserimenti potevano avvenire solo tramite una determinata interfaccia utente, che prevedeva solo inserimenti sequenziali, quindi ordinati.
Ora sono intervenute delle modifiche, per esigenze di lavoro, direttamente sul database in quanto l'interfaccia utente non permetteva di farle (e far aggiornare l'interfaccia utente sarebbe stato troppo costoso) e l'ordine è andato perso.
Legato al database ho un programma in visual basic, che si occupa di creare un pdf (di circa 300 pagine): essendo stato pensato per lavorare con tuple gia' "ordinate" non effettua al suo interno una order by prima di leggere i dati dal database, quindi il risultato viene sballato, a meno di ordinare manualmente le poche tuple fuori posto e quindi ripristinare manualmente la situazione che lui si aspetta di trovare nella tabella...
Anche far aggiornare il programma in VB mi è stato scartato in quanto troppo costoso, potrei farlo anche io senza problemi, ma, nel momento in cui lo abbiamo comprato non abbiamo avuto i sorgenti del programma ovviamente.
ps : ho parlato per semplicità di tabella, ma in realtà sono più di una, tutte con lo stesso problema.

shinya
13-03-2007, 08:38
Si ma è sbagliato proprio il concetto da cui siete partiti.
E' errato presupporre che una select ti ritorni i dati in un certo ordine senza un order by. L'ordine può cambiare per N motivi (come è successo poi).

Gli insiemi non hanno ordine.

Andrea16v
13-03-2007, 18:04
Si ma è sbagliato proprio il concetto da cui siete partiti.
E' errato presupporre che una select ti ritorni i dati in un certo ordine senza un order by. L'ordine può cambiare per N motivi (come è successo poi).

Gli insiemi non hanno ordine.

Lo so bene, ma quella che ho descritto è solo la situazione che ho trovato.
In ogni caso il programma non era così gravemente sbagliato, perchè era pensato per uno scopo ben preciso e limitato, semplicemente è stato forzato a far qualcosa di molto diverso per esigenze di risparmio, senza richiedere la modifica all'azienda che l'ha prodotto.
Comunque eseguendo un backup tabella per tabella, dopo aver eseguito una order by su ogni tabella, dovrebbe funzionare, domani provo anche se è una menata, ma per ora l'unica soluzione...