Newsgroup: it.lavoro.professioni.webmaster
Titolo: Mysql mi mette dentro i record al contrario?

No scusate forse sto impazzendo o sto prendendo una cantonata.
Ma io inserisco es. 10 record ed i campi id autoincrement vengono 
inseriti correttamente es. a 10 11 12 13 ecc.
Ma quando vado a rileggerli dal db es. select * from tabella where 
campox = 'pippo' (senza nessun order by) mi vengono passati nel 
recordset in ordine inverso: prima il record con id 20, poi il record 
con id 19, poi 18 ecc.
Sarà che è domenica sera e sono stanco ma non ci arrivo. Cosa sta 
succedendo?

 succedendo?
Ed è pure sabato, guarda come sono conciato...

recordset in ordine inverso
Bene!
Il DBMS ti sta ricordando che, se non metti ORDER BY, non devi
aspettarti alcun ordine particolare.
Sarebbe ancora meglio se te li ritornasse ogni volta in ordine
casuale e diverso - ma probabilmente implementarlo aveva costi
eccessivi.
Se li vuoi ordinati per id, DEVI aggiungere "ORDER BY id".
Leonardo
-- 
Linten addie toorin addie,
Linten addie toorin ee,
Linten lowrin lowrin lowrin,
The barnyards of Delgaty


beh beh .... sei sicuro di quello che dici? A rigor di logica se non 
specifichi alcun ORDER BY dovresti ottenere proprio un elenco di record 
ordinati per id ... 

Marvin Mars ha scritto:

Penso che dipenda anche su come è definito id.

 aspettarti alcun ordine particolare.
Ho sempre ritenuto che una serie di insert mettesse nel db quei record 
in quell'ordine. Al massimo, a seguito della copertura di "buchi" 
(record precedentemente cancellati), potevano non trovarsi contigui, ma 
comunque in quell'ordine.
E ho sempre ritenuto che una select, senza order, restituisse i record 
come ritrovati sul db, quindi nell'ordine in cui sono stati inseriti, 
quindi con id crescente in quanto id campo autoincrement.
Mai mi era capitato di leggere un recordset e di trovarci gli id 
decrescenti.
L'anomalia non si presenta sulla select, che funziona come ho detto: 
prende i record nell'ordine in cui li trova nella tabella.
L'anomalia pare riguardare l'insert. E' l'insert infatti che inserisce 
in senso inverso i record. Cioè ne inserisce uno, poi ne inserisce un 
altro ma prima del primo (sicuramente sfruttando un "buco"), poi ne 
inserisce un altro prima del secondo ecc.
Che gli insert vadano a coprire i buchi l'ho sempre visto. Ma il buco 
che ho sempre visto coprire era il primo disponibile nella tabella 
mentre qua pare che a venire coperto sia di volta in volta l'ultimo 
disponibile nella tabella.
Sembra che a soffrire di questa anomalia siano solamente le tabelle su 
cui ho operato maggiormente.
E' noto un fenomeno del genere in mysql?

 con id 19, poi 18 ecc.
Dovresti controllare quale campo è impostato come chiave primaria
(primary key)

 (primary key)
Naturalmente id.

ordinati per id ... 
Questo PUO' succedere in alcune versioni di alcuni RDBMS, ma lo standard
dice che in assenza di ORDER BY, le tuple sono "in no particular order".
Questo vuol dire che se fai l'errore di pensare che "l'order by id e' lo
stato naturale della tabella", anche se questo PUO' essere vero per quel
particolare RDBMS (e tabella) che stai usando, rischi di produrre codice
che si comporta male all'improvviso:
	* Quando le tabelle sono InnoDB invece che MyISAM su MySQL,
	* Quando passi da MySQL A.B.C a MySQL D.E.F,
	* Quando passi da MySQL a PostgreSQL/Oracle/altro,
	* Quando la tabella supera i 255 o i 1023 record,
	* e altri casi ancora.
...tutto per non mettere un "ORDER BY id" (che tra l'altro, se *DAVVERO*
l'ordinamento naturale e' per id, e' a costo zero).
Naa, sono cose che non si fanno.



mi hai convinto :-)