[myslq] problema con update
- skonvols2k
- Prode Principiante
- Messaggi: 111
- Iscrizione: mercoledì 29 marzo 2006, 21:55
- Località: Napoli
[myslq] problema con update
salve, ho il seguente problema con l'update di mysql:
ho un db con un numero, un titolo e una categoria, mettiamo che una certa categoria vada dal numero 200 al 300.
vorrei aggiornare il numero delle tuple della categoria in modo che rimanga tra 200 e 300 ma seguendo l'ordine alfabetico dato da titolo.
si consideri anche che num è chiave primaria.
vorrei evitare l'uso di php.
GRAZIE
ho un db con un numero, un titolo e una categoria, mettiamo che una certa categoria vada dal numero 200 al 300.
vorrei aggiornare il numero delle tuple della categoria in modo che rimanga tra 200 e 300 ma seguendo l'ordine alfabetico dato da titolo.
si consideri anche che num è chiave primaria.
vorrei evitare l'uso di php.
GRAZIE
Re: [myslq] problema con update
non ho capito cosa ti serve. Fai un esempio cosi' da capire bene il problema.skonvols2k ha scritto: salve, ho il seguente problema con l'update di mysql:
ho un db con un numero, un titolo e una categoria, mettiamo che una certa categoria vada dal numero 200 al 300.
vorrei aggiornare il numero delle tuple della categoria in modo che rimanga tra 200 e 300 ma seguendo l'ordine alfabetico dato da titolo.
si consideri anche che num è chiave primaria.
vorrei evitare l'uso di php.
GRAZIE
Evitare php puoi farlo tranquillamente ma nel senso che o fai un update da dentro mysql (se non riesci con un'update secca ti crei una procedura o una function memorizzandola in mysql direttamente) oppure usi un altro linguaggio di programmazione. Dipende se ti serve una sola volta oppure piu' volte.
ciao
- skonvols2k
- Prode Principiante
- Messaggi: 111
- Iscrizione: mercoledì 29 marzo 2006, 21:55
- Località: Napoli
Re: [myslq] problema con update
ciao praticamente ho una situazione simile a questa:prampa ha scritto:non ho capito cosa ti serve. Fai un esempio cosi' da capire bene il problema.skonvols2k ha scritto: salve, ho il seguente problema con l'update di mysql:
ho un db con un numero, un titolo e una categoria, mettiamo che una certa categoria vada dal numero 200 al 300.
vorrei aggiornare il numero delle tuple della categoria in modo che rimanga tra 200 e 300 ma seguendo l'ordine alfabetico dato da titolo.
si consideri anche che num è chiave primaria.
vorrei evitare l'uso di php.
GRAZIE
Evitare php puoi farlo tranquillamente ma nel senso che o fai un update da dentro mysql (se non riesci con un'update secca ti crei una procedura o una function memorizzandola in mysql direttamente) oppure usi un altro linguaggio di programmazione. Dipende se ti serve una sola volta oppure piu' volte.
ciao
Num Titolo Categoria
........................... ecc.
100 bfs altro
........................... ecc.
200 ACB prova
201 ABC prova
........................... ecc.
301 fgd pippo
vorrei fare un update in modo che gli appartenti alla cat. "prova" siano ordinati in ordine alfabetico e quindi aggiornato il campo "Num", cioè:
Num Titolo Categoria
........................... ecc.
100 bfs altro
........................... ecc.
200 ABC prova
201 ACB prova
cioè vorrei fare:
UPDATE db SET Num=????? WHERE Categoria="prova" ORDER BY Titolo
il problema è che non so cosa mettere in ?????
grazie
Re: [myslq] problema con update
questa potrebbe essere una soluzione, anche senza linguaggi di programmazione.
E' una stored procedure e la mandi in esecuzione con call procedura1; da dentro mysql senza utilizzare alcun linguaggio di programmazione e tutte le volte che vuoi.
Allora: per prima cosa una chiave primaria è una chiave e basta, un numero in questo caso, e non puoi utilizzarla per altri scopi. Il suo unico scopo è riconoscere univocamente un'occorrenza nella tabella e a cui deve corrispondere univocamente qualsiasi attrbuto della tabella. Conta che l'aggiornameto di una chiave primaria è in realtà una cancellazione ed un inserimento e pensa quante cose dovresti verificare, ad esempio la chiave duplicata.
Se hai questa necessità, aggiungi un altro campo, numerico che aggiornerai in base all'ordinamento del titolo nell'ambito della categoria. Se ho capito, ti serve un contatore che, all'interno della categoria ordinando per titolo, o parta da 1 oppure parta dal minore di tutti i numeri collegati alla categoria. In questa stored procedure dovrai cambiare FP con il nome del tuo DB e il nome della procedura (procedura1). Dovrai cambiare la select all'interno del cursore (recuperando solo la chiave primaria ordinando per titolo) in base alle tue esigenze e impostare la variabile "a" con il tipo giusto. La variabile "b" per ora parte da 1, ma puoi impostarci la min(numero) per la categoria, cosi' da partire esattamente con il valore piu' basso. E poi all'interno del ciclo aggiorni il nuovo campo per chiave primaria con il valore di "b". Il nome della categoria potresti fornirla anche da parametro.
Altrimenti potesti anche provare a estrarre tutte le occorrenze della categoria ordinandole per titolo, salvarle in un array, cancellare tutti i numeri associati con la categoria e poi inserire nuovamente leggendo dall'array, avendo avuto l'accortezza di salvarti il numero piu' basso. Cosi' almeno non incorrerai in problemi di chiave duplicata.
Boh....non mi vengono in mente altre soluzioni senza utilizzare un linguaggio di programmazione specifico. Ah, i $$ li devi lasciare cosi come sono perche' gli servono come delimitatore per l'esecuzione.
Ma i numeri collegati con le categorie....sono sempre in sequenza? oppure possono avere numeri anche non contigui? perche' la logica potrebbe anche cambiare....
ciao
Codice: Seleziona tutto
DELIMITER $$
DROP PROCEDURE IF EXISTS `FP`.`procedura1`$$
CREATE PROCEDURE `procedura1`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a SMALLINT(5);
DECLARE b INT default 0;
DECLARE cur1 CURSOR FOR SELECT id_deco from DECO;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
set b = b + 1;
FETCH cur1 INTO a;
UNTIL done END REPEAT;
CLOSE cur1;
END$$
DELIMITER ;
Allora: per prima cosa una chiave primaria è una chiave e basta, un numero in questo caso, e non puoi utilizzarla per altri scopi. Il suo unico scopo è riconoscere univocamente un'occorrenza nella tabella e a cui deve corrispondere univocamente qualsiasi attrbuto della tabella. Conta che l'aggiornameto di una chiave primaria è in realtà una cancellazione ed un inserimento e pensa quante cose dovresti verificare, ad esempio la chiave duplicata.
Se hai questa necessità, aggiungi un altro campo, numerico che aggiornerai in base all'ordinamento del titolo nell'ambito della categoria. Se ho capito, ti serve un contatore che, all'interno della categoria ordinando per titolo, o parta da 1 oppure parta dal minore di tutti i numeri collegati alla categoria. In questa stored procedure dovrai cambiare FP con il nome del tuo DB e il nome della procedura (procedura1). Dovrai cambiare la select all'interno del cursore (recuperando solo la chiave primaria ordinando per titolo) in base alle tue esigenze e impostare la variabile "a" con il tipo giusto. La variabile "b" per ora parte da 1, ma puoi impostarci la min(numero) per la categoria, cosi' da partire esattamente con il valore piu' basso. E poi all'interno del ciclo aggiorni il nuovo campo per chiave primaria con il valore di "b". Il nome della categoria potresti fornirla anche da parametro.
Altrimenti potesti anche provare a estrarre tutte le occorrenze della categoria ordinandole per titolo, salvarle in un array, cancellare tutti i numeri associati con la categoria e poi inserire nuovamente leggendo dall'array, avendo avuto l'accortezza di salvarti il numero piu' basso. Cosi' almeno non incorrerai in problemi di chiave duplicata.
Boh....non mi vengono in mente altre soluzioni senza utilizzare un linguaggio di programmazione specifico. Ah, i $$ li devi lasciare cosi come sono perche' gli servono come delimitatore per l'esecuzione.
Ma i numeri collegati con le categorie....sono sempre in sequenza? oppure possono avere numeri anche non contigui? perche' la logica potrebbe anche cambiare....
ciao
- skonvols2k
- Prode Principiante
- Messaggi: 111
- Iscrizione: mercoledì 29 marzo 2006, 21:55
- Località: Napoli
Re: [myslq] problema con update
grazie mille scusami se non è un problema per te potresti accennare anche questa soluzione con l'array?prampa ha scritto: Altrimenti potesti anche provare a estrarre tutte le occorrenze della categoria ordinandole per titolo, salvarle in un array, cancellare tutti i numeri associati con la categoria e poi inserire nuovamente leggendo dall'array, avendo avuto l'accortezza di salvarti il numero piu' basso. Cosi' almeno non incorrerai in problemi di chiave duplicata.
Boh....non mi vengono in mente altre soluzioni senza utilizzare un linguaggio di programmazione specifico. Ah, i $$ li devi lasciare cosi come sono perche' gli servono come delimitatore per l'esecuzione.
Ma i numeri collegati con le categorie....sono sempre in sequenza? oppure possono avere numeri anche non contigui? perche' la logica potrebbe anche cambiare....
ciao
i numeri sono sempre da un min a un max al più c'è un qualche "buco" nella sequenza.
grazie grazie grazie
Re: [myslq] problema con update
non capisco se va bene aggiungendo un campo oppure tu abbia la necessità di aggiornare sempre la chiave primaria. Il numero sequenziale deve partire da 1 oppure dal valore piu' basso del campo "numero" all'interno della categoria? (puoi utilizzare un contatore oppure utilizzare i numeri esistenti?) posta la struttura della tua tabella, per fare delle prove. E' comunque fondamentale sapere se preferisci questo metodo all'uso di un qualsiasi linguaggio che si interfaccia con mysql.
ciao
ciao
- skonvols2k
- Prode Principiante
- Messaggi: 111
- Iscrizione: mercoledì 29 marzo 2006, 21:55
- Località: Napoli
Re: [myslq] problema con update
vorrei aggiornare la chiave primaria (anche se non è elegante)prampa ha scritto: non capisco se va bene aggiungendo un campo oppure tu abbia la necessità di aggiornare sempre la chiave primaria. Il numero sequenziale deve partire da 1 oppure dal valore piu' basso del campo "numero" all'interno della categoria? (puoi utilizzare un contatore oppure utilizzare i numeri esistenti?) posta la struttura della tua tabella, per fare delle prove. E' comunque fondamentale sapere se preferisci questo metodo all'uso di un qualsiasi linguaggio che si interfaccia con mysql.
ciao
dal min all'interno della categoria.
vorrei usare mysql e basta.
ecco la struttura:
Campo Tipo
Num int(3)
Case smallint(2)
Titolo varchar(255)
Anno int(4)
Genere varchar(20)
Stato varchar(25)
Data timestamp
Supporto varchar(6)
si tratta di un db di dvd
Re: [myslq] problema con update
cosi' funziona
al posto di:
- videoteca, imposti il nome del tuo db
- dvd, imposti il nome della tua tabella
- prova, metti il nome della procedura che vuoi
poi da dentro mysql esegui call nomedb.nomeprocedura(nomecategoria);
dove per
- nomedb è il nome del tuo db (oppure ti connetti al db e lo puoi omettere)
- nomeprocedura è il nome della procedura che hai impostato prima
- nomecategoria è il genere
Questa procedura assegna sequenziamente delle nuove chiavi primarie ai titoli partendo dal minore per categoria. La rinumerazione segue l'ordinamento per titolo nell'ambito di una categoria.
Poi devi aggiungere gli altri campi (io ho impostato solo i principali) e magari utilizzare funzioni di porta a maiuscolo o minuscolo sulle query di ricerca dati per genere, perche' cosi' come è ora risulta case sentitive.
Prima di usarlo sul db ufficiale fatti tre belle copie e usalo sulle copie.
ciao
Codice: Seleziona tutto
DELIMITER $$
DROP PROCEDURE IF EXISTS `videoteca`.`prova`$$
CREATE PROCEDURE `prova`(par VARCHAR(250))
BEGIN
DECLARE a1 INT DEFAULT 0;
CREATE TABLE appoggio ENGINE=HEAP SELECT * FROM dvd where genere=par;
DELETE FROM dvd where genere = par;
SELECT min(num) into a1 from appoggio;
insert into dvd (num, titolo, genere)
SELECT @a2:=@a2+1 newnum, t.titolo, t.genere
FROM (SELECT @a2:=a1-1) r, appoggio t
order by t.titolo;
DROP TABLE appoggio;
END$$
DELIMITER ;
- videoteca, imposti il nome del tuo db
- dvd, imposti il nome della tua tabella
- prova, metti il nome della procedura che vuoi
poi da dentro mysql esegui call nomedb.nomeprocedura(nomecategoria);
dove per
- nomedb è il nome del tuo db (oppure ti connetti al db e lo puoi omettere)
- nomeprocedura è il nome della procedura che hai impostato prima
- nomecategoria è il genere
Questa procedura assegna sequenziamente delle nuove chiavi primarie ai titoli partendo dal minore per categoria. La rinumerazione segue l'ordinamento per titolo nell'ambito di una categoria.
Poi devi aggiungere gli altri campi (io ho impostato solo i principali) e magari utilizzare funzioni di porta a maiuscolo o minuscolo sulle query di ricerca dati per genere, perche' cosi' come è ora risulta case sentitive.
Prima di usarlo sul db ufficiale fatti tre belle copie e usalo sulle copie.
ciao
- skonvols2k
- Prode Principiante
- Messaggi: 111
- Iscrizione: mercoledì 29 marzo 2006, 21:55
- Località: Napoli
Re: [myslq] problema con update
grandioso grazie !!! + tardi lo provo e ti faccio sapere.
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti
