Gestire il valore di una chiave primaria

lunedì 13 novembre 2006 - 12.16

bluelions Profilo | Senior Member

Salve amici, vi scrivo perchè avrei un problemino da risolvere in merito alla chiave primaria di una tabella.Vi spiego subito il problema:
Ho una tabella con una id che è di tipo int 4 not null e in identity è impostata su si. Ora faccio delle prove di inserimento....quando poi mi serve una tabella pulita, <faccio una delete di tutto erò quando provo a fare un inserimento mi parte dall'ultimo indice creato, esempio se precedentemente ho create tre record,dopo la delete se faccio un inserimento mi parte da 4,mentre io vorrei che partisse da 1.Ora mi domandavo,come poter risolvere il problema?
Resto fiducioso di una vs risposta

lbenaglia Profilo | Guru

>Ora mi domandavo,come poter risolvere il problema?

Ciao bluelions,

per azzerare il contatore devi svuotare la tabella con il comando TRUNCATE TABLE <schema>.<nome tabella>;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluelions Profilo | Senior Member

ma è giusto utilizzare la funzione TRUNCATE? qual'è la differenza con la delete?

lbenaglia Profilo | Guru

>ma è giusto utilizzare la funzione TRUNCATE?
Nel caso in cui debba svuotare la tabella non è solo giusto, ma addirittura consigliato

> qual'è la differenza con la delete?
Che il comando TRUNCATE TABLE è minimamente loggato, ovvero inserisce nel transaction log solo la deallocazione delle pagine, quindi risulta essere estremamente più efficiente rispetto alla DELETE.
La contropartita è che il comando TRUCATE TABLE non accetta alcuna clausola WHERE, quindi non puoi eliminare solo parte delle righe.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluelions Profilo | Senior Member

ok,quindi sono pienamente d'accordo,però ammettiamo questa condizione.....io ho una tabella con questa chiave primaria in ordine......1,2,3,4,5 e così via....nel caso in cui devo svuotare la tabella e ripristinare la chiave utilizzo la TRUNCATE.
Però facciamo caso che durante l'esecuzione del mio programma devo cancellare una serie di righe (es. il record 3,5) devo utilizzare la DELETE perchè ho bisogno di utilizzare la condizione WHERE....a questo punto però avro sulla mia tabella tutti i record tranne quelli con ID 3 e 5, e possibile poi riordinarli e farli scalare o non saranno più utilizzati?
Come funziona tutto ciò? Conviene lasciarli così non allocati?

lbenaglia Profilo | Guru

>Però facciamo caso che durante l'esecuzione del mio programma
>devo cancellare una serie di righe (es. il record 3,5) devo utilizzare
>la DELETE perchè ho bisogno di utilizzare la condizione WHERE....a
>questo punto però avro sulla mia tabella tutti i record tranne
>quelli con ID 3 e 5, e possibile poi riordinarli e farli scalare
>o non saranno più utilizzati?

Cosa te ne frega se gli ID 3 e 5 non sono più disponibili?
Lo scopo della proprietà IDENTITY è quello di generare una sequenza di valori che abbinati ad un constraint UNIQUE o PRIMARY KEY assicurano l'univocità degli stessi.
Teoricamente i numeri potrebbero essere in un ordine randomico che il discorso non farebbe una piega.

Se quello che cerchi è una sequenza di numeri "senza buchi" dovrai procedere applicativamente (ad esempio sfruttando la nuova funzione ROW_NUMBER offerta da SQL Server 2005), anche se sinceramente non ne immagino lo scopo.

A titolo di esempio leggi i seguenti Tips:

"Come numerare le righe con SQL Server 2000"
http://www.dotnethell.it/tips/Numerare-Record-SQL2000.aspx

"Come numerare le righe con SQL Server 2005"
http://www.dotnethell.it/tips/Numerare-Record-SQL2005.aspx

>Come funziona tutto ciò? Conviene lasciarli così non allocati?
Certo, non fanno male a nessuno
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

bluelions Profilo | Senior Member

Lo scopo è che io quegli id sono in join con un altra tabella.....quindi se elimino la riga 5 questo vuol dire che non ho più la relazione con l'altra tabella.Ti spiego subito...ho una tabella Anagrafica dove c'è l'anagrafica di una persona e tramite la id è in join con la tabella titolo studio che all'inserimento del titolo di studio prendo l' ID della tabella anagrafica....così mantengo l'univocità....se come ti dicevo cancello la id di angrafica ho un record sull'altra tabella che non mi serve a nulla

lbenaglia Profilo | Guru

>Lo scopo è che io quegli id sono in join con un altra tabella.....quindi
>se elimino la riga 5 questo vuol dire che non ho più la relazione
>con l'altra tabella.
Il modo più efficiente per garantire una relationship tra tabelle è quella di definire un constraint FOREIGN KEY sulla tabella dalla parte molti della relazione.

>Ti spiego subito...ho una tabella Anagrafica
>dove c'è l'anagrafica di una persona e tramite la id è in join
>con la tabella titolo studio che all'inserimento del titolo di
>studio prendo l' ID della tabella anagrafica....così mantengo
>l'univocità....se come ti dicevo cancello la id di angrafica
>ho un record sull'altra tabella che non mi serve a nulla
Definisci un constraint FOREIGN KEY che elimini a cascata le righe correlate.

"FOREIGN KEY Constraints "
http://msdn2.microsoft.com/en-us/library/ms175464.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5