>Salve
ciao!
>Ho provato ad impostare id cliente come int mettendolo chiave
>primaria e identity... ma non credo di aver fatto bene in quanto
>a volta ho dei "salti" rispetto all'ultimo numero inserito. Insomma
>non rispetta, a volte, la giusta progression.
Quando imposti un campo come IDENTITY, passi due parametri: uno è la "partenza" del tuo identificatore e l'altro è il "passo", e quindi di quanto "avanza" il valore della colonna. Ad esempio un IDENTITY(1,1) parte da 1 ed incrementa di 1 ad ogni record inserito.
Ora, viene da se che se non hai sbagliato la definizione i "salti" sono dovuti ad avvenimenti di altra natura
.
Ad esempio, se hai un errore durante un inserimento (Foreign Key, overflow, vincoli unique non rispettati), l'identity incrementa ugualmente. Di conseguenza il valore che viene inserito al primo caricamento corretto del record potrebbe non essere quello che ti aspetti dalla progressione che hai impostato.
Se poi cancelli record dalla tabella gli id vengono eliminati per sempre e nuovi inserimenti non riempiranno i "buchi" creati.
Se però gli inserimenti sono sempre corretti, la progressione è garantita, a meno che non si forzi il valore dell'identity o che non si disabiliti l'opzione per inserire a mano (o da sorgente diversa) altri record.
Qui un esempio di "salto":
USE tempdb;
GO
CREATE TABLE ids
(
id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
, valore CHAR(1)
)
GO
CREATE UNIQUE NONCLUSTERED INDEX ix_ids ON ids
(
valore
)
GO
INSERT INTO ids (valore) SELECT 'A'
INSERT INTO ids (valore) SELECT 'B'
INSERT INTO ids (valore) SELECT 'C'
-- errore di string truncation
INSERT INTO ids (valore) SELECT 'AAAAA'
INSERT INTO ids (valore) SELECT 'D'
SELECT * FROM ids
/*
4 --> buco
id valore
----------- ------
1 A
2 B
3 C
5 D
*/
-- errore di univocità
INSERT INTO ids (valore) SELECT 'C'
INSERT INTO ids (valore) SELECT 'E'
SELECT * FROM ids
/*
id valore
----------- ------
1 A
2 B
3 C
5 D
7 E
*/
DROP TABLE ids
GO
>Sapete aiutarmi?
Puoi pensare di prendere il massimo id (se nullo è 0) aggiungendo 1.
Oppure puoi prendere la TOP 1 id dalla tabella, ordinandola per id descending.
Sono operazioni piuttosto pesanti e la pesantezza si fa sentire ancora di più se la tabella è destinata a crescere molto.
In tal caso, puoi pensare di segnarti in una tabellina di appoggio il massimo id inserito per poi utilizzarlo coi nuovi inserimenti.
Bisogna però fare molta attenzione a gestire correttamente le transazioni in modo che in caso di concorrenza non si verifichino errori.
Se usi identity, elimini gli errori ed hai un progressivo valido ![](/img/emo3.gif)
>Grazie
di nulla!![](/img/emo2.gif)
Alx81 =)
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org