Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Gestire il valore di una chiave primaria
lunedì 13 novembre 2006 - 12.16
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
bluelions
Profilo
| Senior Member
244
messaggi | Data Invio:
lun 13 nov 2006 - 12:16
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
5.625
messaggi | Data Invio:
lun 13 nov 2006 - 13:13
>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
244
messaggi | Data Invio:
mar 14 nov 2006 - 14:40
ma è giusto utilizzare la funzione TRUNCATE? qual'è la differenza con la delete?
lbenaglia
Profilo
| Guru
5.625
messaggi | Data Invio:
mar 14 nov 2006 - 14:44
>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
244
messaggi | Data Invio:
mar 14 nov 2006 - 16:18
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
5.625
messaggi | Data Invio:
mar 14 nov 2006 - 16:29
>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
244
messaggi | Data Invio:
mar 14 nov 2006 - 16:42
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
5.625
messaggi | Data Invio:
mar 14 nov 2006 - 17:12
>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
Torna su
Stanze Forum
Elenco Threads
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 !