Contatori e qualche tips su tabelle
In Mysql esiste una proprietà del campo int che si chiama AUTO_INCREMENT, che permette senza nessun tipo di sforzo di gestire ID univoci, senza bisogno di nessun altro accorgimento.
A questo punto che senso ha parlare di auto_increment? ![]()
Questa proprietà offre numerosi vantaggi, ma per utilizzarla appieno bisogna conoscerne almeno anche qualche caratteristica, il contatore parte per default da 1, e memorizza il max(id) così da immettere automaticamente un id che non è stato mai usato prima, ma se ho ad esempio 5 campi numerati da 1 a 5 e cancello i record con id 4,5 che numero avrà l'id successivo? ovvio: 6! ![]()
e se volessi ricominciare dal primo numero dopo X? a questo punto ci viene comodo sapere che esiste una "variabile" dedicata alla tabella nella quale specificare il numero dal quale incominciare per iniziare una numerazione:
ALTER TABLE nomeTabella AUTO_INCREMENT = X
Se invece, come mi capita spesso, ho un campo id con valori veramente distribuiti a caso, il modo più veloce che conosco è, per non modificare l'ordine dei record, aggiungere una colonna ID_TMP auto_increment e successivamente cancellare la vecchia..
per prima cosa quindi, visto che non possiamo avere due primary key in una tabella eliminiamo il riferimento alla primary key del vecchio id con
ALTER TABLE `test` CHANGE `ID` `ID` INT( 11 ) NOT NULL ;
ALTER TABLE `test` DROP PRIMARY KEY
la prima riga serve perchè una colonna con valore automatico DEVE essere una chiave della tabella ![]()
poi aggiungiamo un nuovo campo autoincrementale
ALTER TABLE `test` ADD `ID_TMP` INT NOT NULL AUTO_INCREMENT ,ADD PRIMARY KEY(`ID_TMP`)
eliminiamo il vecchio id e cambiamo nome al temp e il gioco è fatto!
ALTER TABLE `test` DROP `ID`
ALTER TABLE `test` CHANGE `ID_TMP` `ID` INT NOT NULL AUTO_INCREMENT
a questo punto la domanda è lecita.. e se volessimo partire da 0?
la procedura è pressocchè la stessa,ma dobbiamo stare attenti ad un paio di cose, quando creiamo l'indice ausiliario lo dobbiamo dichiarare INT e basta:
ALTER TABLE `test` ADD `ID_TMP` INT
poi mettiamo a 0 il suo indice più basso:
select MIN(`ID`) from `test` into @a;
UPDATE `test` SET `ID_TMP` = '0' WHERE `test`.`ID` = @a
quindi eliminiamo il primary key ed auto_increment dell' ID vecchio
ALTER TABLE `test` CHANGE `ID` `ID` INT( 11 ) NOT NULL ;
ALTER TABLE `test` DROP PRIMARY KEY
e l'impostiamo al nuovo facendo attenzione alla prima riga! infatti stiamo dicendo a mysql di non auto_suggerirci un nuovo valore quando incontra lo 0:
SET sql_mode="NO_AUTO_VALUE_ON_ZERO";
ALTER TABLE `test` MODIFY `ID_TMP` INT NOT NULL AUTO_INCREMENT ,ADD PRIMARY KEY(`ID_TMP`)
poi procediamo come prima, eliminiamo la colonna ID e rinominiamo ID_TMP in ID
ALTER TABLE `test` DROP `ID`;
ALTER TABLE `test` CHANGE `ID_TMP` `ID` INT NOT NULL AUTO_INCREMENT
et voià! il gioco è fatto!
EDIT:
mi sono scordato una cosa "importante" e cioè rimettere l'ID della tabella come primo campo!!
ALTER TABLE test MODIFY COLUMN ID int FIRST
questo è un comando non tanto conosciuto, ma comodo.. ricordatevi però di mettere il valore del campo in modo giusto!! (int per i numeri varchar per i campi alfanumerici )
intanto che ci siamo vi illustro anche come mettere un campo prima o dopo un altro, se per caso l'ordine di una tabella fosse: secondo,primo,ID potremmo agevolmente con il primo comando mettere l'id all'inizio e poi con questo:
ALTER TABLE test MODIFY COLUMN secondo varchar(255) AFTER primo
ripristinare l'ordine naturale: ID,primo,secondo