Discussione:
Il contatore (auto_increment)
(troppo vecchio per rispondere)
Darkbyte [Home]
2004-09-03 21:46:59 UTC
Permalink
Non che ne abbia una necessità, ma se mi venisse il desìo di
riorganizzare un campo id auto_increment di una tabella, in modo da
recuperare i vecchi valori andati persi con i delete, come si potrebbe fare?
Un metodo sarebbe quello di creare una nuova tabella, droppare la
colonna id e ricrearla come chiave primaria.
Ma c'è qualche istruziome MySQL che faccia qualcosa di simile?
E se volessi invece mantenere intatto il valore del campo id (quindi non
riassegnare tutti i valori come da esempio precedente) e recuperare i
numeri vecchi per assegnarli ai nuovi record che inserirò?
gmax
2004-09-04 09:45:28 UTC
Permalink
Post by Darkbyte [Home]
Non che ne abbia una necessità, ma se mi venisse il desìo di
riorganizzare un campo id auto_increment di una tabella, in modo da
recuperare i vecchi valori andati persi con i delete, come si potrebbe fare?
Un metodo sarebbe quello di creare una nuova tabella, droppare la
colonna id e ricrearla come chiave primaria.
L'unico motivo per cui potresti voler fare una cosa del genere e'
perche' stai usando una sola tabella. Altrimenti, cambiare valore a
chiavi primarie gia' assegnate e' sempre una *pessima idea*.
Si puo' fare cosi':
ALTER TABLE nometabella
DROP PRIMARY KEY,
DROP COLUMN nomecolonna,
ADD COLUMN nomecolonna INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (nomecolonna);

MA NON FARLO!
Post by Darkbyte [Home]
Ma c'è qualche istruziome MySQL che faccia qualcosa di simile?
Non c'e'. E il motivo e' che, sebbene richiesto da molti che avevano i
tuoi stessi motivi, e' una pratica dannosa che conduce a molti effetti
collaterali negativi.
Post by Darkbyte [Home]
E se volessi invece mantenere intatto il valore del campo id (quindi non
riassegnare tutti i valori come da esempio precedente) e recuperare i
numeri vecchi per assegnarli ai nuovi record che inserirò?
Questo lo puoi fare con una tabella di comparazione. Crea una tabella
"numeri" che abbia solo una colonna INT UNSIGNED NOT NULL
AUTO_INCREMENT, inserisci tanti numeri pari al massimo indice nella tua
tabella, e per trovare i numeri non utilizzati usa

SELECT id FROM numeri LEFT JOIN nometabella on (id=nomecolonna)
WHERE nomecolonna IS NULL;

Ma anche in questo caso, *non farlo*.

Se il motivo della tua richiesta e' quello di ottenere un contatore da
usare per la visualizzazione, usa questa tecnica, che genera una
sequenza al volo e senza buchi in mezzo:

SET @contatore := 0;
SELECT
@contatore := @contatore + 1 AS num,
colonna1, colonna2, colonna3,
FROM
nometabella
ORDER BY
colonna_che_piu_ti_piace;


Ciao

gmax
--
____ ____ _____ _ _
/ _ | \(____ ( \ / )
( (_| | | | / ___ |) X (
\___ |_|_|_\_____(_/ \_)
(_____|
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com
Loading...