Immettere il codice del cliente

martedì 01 aprile 2008 - 21.41

86Marco Profilo | Expert

Salve sto da poco studiando sql server sxpress 2005.
Premetto che ho una buona conoscenza di Access.
Ho creato tempo fa con access un database che mi consentiva la registrazione di una complessa procedura di fatturazione. il tutto funziona per il meglio. Per ciò che riguardava il codice cliente (che doveva essere un numero progressivo) utilizzavo un contatore utilizzandolo come chiave primaria.

Ora mi ritorvo a dover creare la stessa tabella in sql express 2005.
Ma come posso inizializzare il numero del cliente in modo tale che sia un numero impostato automaticamente ad ogni immissione di un nuovo cliente?

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.
Sapete aiutarmi?
Grazie

alx_81 Profilo | Guru

>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

>Grazie
di nulla!

Alx81 =)

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5