PDA

View Full Version : [MySQL] Trovare il risultato successivo


das
11-11-2007, 14:57
ho una tabella fatta così:

| CRC32 | DATI |
|----------|------------ |
|12345678 | ciaociao |
|63712637 | pincopallino |
|89839393 | aaaabbbb |
---------------------------

L'applicazione che sto facendo usando le C API di mysql ha un loop dove deve
elaborare un rigo alla volta. Ogni ciclo potrebbe aggiungere nuovi valori alla tabella. Mi servirebbe un modo per fare questo:

while (ci sono ancora righe da elaborare) {
pesca nuova riga da elaborare;
Elaborala;
}

Non posso usare un ID con l'autoincrement prtchè CRC32 deve essere la chiave primaria, ma se c'è un valore che si autoincrementa la chiave primaria deve essere per forza quella.

Qualcuno sa come si fa a fare 'pesca nuova riga da elaborare;' ?
Grazie

trallallero
12-11-2007, 09:38
ma un cursore no ?

trallallero
12-11-2007, 09:41
altrimenti (se ho capito bene ... lunedì mattina ho bisogno di qualche ora :D)
puoi fare un;

order by CRC32
having CRC32 > ulitmo_CRC32_letto

lattone
12-11-2007, 11:54
Esattamente come hai scritto tu :D

usando la documentazione http://dev.mysql.com/doc/refman/5.0/en/apis.html diventa.....

while (riga = mysql_fetch_row(result))
printf("%s\n",riga[i]);
{

das
12-11-2007, 16:06
Esattamente come hai scritto tu :D

usando la documentazione http://dev.mysql.com/doc/refman/5.0/en/apis.html diventa.....

while (riga = mysql_fetch_row(result))
printf("%s\n",riga[i]);
{

No perchè i dati si possono aggiungere ad ogni ciclo, per cui per essere sicuro che siano tutti dovrei fargli fare la ricerca da capo ogni volta.
Inoltre questo potrebbe caricare in Ram di più informazioni di quante questa possa contenere.

Non posso ordinare neppure per crc perchè i dati aggiunti in ogni ciclo non è detto che abbiano un crc più alto di quelli che ho già elaborato per cui rischierei di saltare qualche riga.

Ora guardo su google cosa sono i cursori, dal nome sento che fanno al caso mio

isAlreadyInUse
12-11-2007, 16:08
Perche nn fai un trigger sull INSERT

das
12-11-2007, 16:12
Cosa vuol dire ?

isAlreadyInUse
12-11-2007, 16:17
A livello di database puoi impostare determinate azioni al verificarsi di un evento (INSERT,UPDATE,DELETE) quindi se la tua esigenza è elaborare l'ultima riga inserita puoi impostare un trigger che all'insert di una nuova riga faccia le sue elaborazioni sulla stessa.
Spero di essere stato chiaro

trallallero
12-11-2007, 16:24
c'è qualcosa che non va ... se ad ogni fetchata potrebbe inserire, è un ciclo infinito. O sbaglio ?

isAlreadyInUse
12-11-2007, 16:26
Dice che ogni ciclo "potrebbe" inserire, ma bisogna capire bene che deve fare effettivamente

trallallero
12-11-2007, 16:29
Dice che ogni ciclo "potrebbe" inserire, ma bisogna capire bene che deve fare effettivamente

già ... anche io stavo pensando ad un trigger ma dipende da cosa deve fare col dato inserito.
Altrimenti, se c'è in MySQL come in Oracle, un CURSOR FOR INSERT ma a me personalmente non piace.

isAlreadyInUse
12-11-2007, 16:34
Stiamo a vedere se ci da qualche indicazione in piu :asd:

das
13-11-2007, 11:18
Il problema non era elaborare l'ultima soluzione inserita, ma quella successiva all'ultima elaborata. Comunque sono riuscito a trovare la soluzione, è banale ma non ci avevo pensato fino a quando non ho notato che phpmyadmin fa vedere le righe a 30 alla volta, ogni volta partendo dalla successiva all'ultima della pagina precedente.

LIMIT x,1

dove x viene incrementato di 1 in 1.

Non so se la soluzione è la più veloce possibile, ma intanto funziona.

Grazie, ciao

Player1
14-11-2007, 11:28
Salve, scusate se mi intrufolo in questa discussione ma anch'io ho un problema con gli Id di mysql quindi per evitare di aprire decine di nuove discussioni che trattano di cose simili mi sono inserito qui.
Il mio problema è molto molto più semplice da risolvere, sono ancora inesperto, quindi scusate se la domanda è stupida:rolleyes:
Devo fare una tabella senza chiave primaria nei campi che mi interessano quindi avrei bisogno che fosse mysql ad inventarsi una chiave per ogni inserimento.
Da quello che ho capito l'unico modo per fare ciò è quello di mettere un semplice indice con autoincremento per identificare le righe.
Ho però il seguente dubbio legato a questo meccanismo, se ogni volta che inserisco una riga l'indice si incrementa di uno non succede che prima o poi si arriverà ad un overflow?
Es:
All'inizio ho 3 righe con id rispettivamente 1,2,3
Cancello la 2 ed inserisco la nuova ottengo 1,3,4
cancello la 3 e ne inserisco un'altra ottengo 1,4,5
e così via..
Alla fine per sole 3 righe arrivo a dei numeri di id altissimi fino ad un overflow.

A me non interessa che le righe siano ordinate, mi interessa solo inserire un identificatore univoco per ogni riga.
Es:
All'inizio ho 3 righe con id rispettivamente 1,2,3
Cancello la 2 ho 1,3
inserisco una nuova riga ho 1,2(la nuova riga assume il primo valore disponibile),3

Ovviamente anche se gli id creati da Mysql fossero diversi da semplici numeri (ad esempio stringhe incomprensibili tipo "907ahyp" purchè logicamente univoche) per me andrebbe bene.

C'è qualche soluzione che consenta di sfruttare una funzione automatica di Mysql senza dover per forza fare la scansione di tutti gli id in php e creare una funzione che si inventi un nuovo id univoco?

Grazie in anticipo per le risposte :)

isAlreadyInUse
14-11-2007, 11:34
Quanti milioni di record prevedi che vengano iseriti?

trallallero
14-11-2007, 11:37
secondo me non esiste. Mi sa che te la devi fare da solo la funzione in un TRIGGER.
Comunque non mi preoccuperei più di tanto dell'overflow, è superiore a 2100000000 ;)

isAlreadyInUse
14-11-2007, 11:39
Dipende dal tipo specificato per il campo da incrementare, un BIGINT è abbondante 18.446.744.073.709.551.615

Player1
14-11-2007, 11:59
Ok allora utilizzerò la soluzione dell'indice con autoincremento.
In realtà non credo si raggiungerà mai l'overflow era giusto per una questione di "eleganza" nella progettazione, ma effettivamente se non ci sono altri metodi a parte quello di creare un trigger con una funzione apposita userò l'autoincremento.
Grazie per le risposte e per la rapidità con cui mia avete risposto! :)
Buona giornata!