Ripristina valore IDENTITÀ


16

Ho una tabella con una colonna IDENTITY. Durante lo sviluppo, di tanto in tanto cancello le righe e le aggiungo di nuovo. Ma i valori di IDENTITÀ hanno continuato ad aumentare e non sono partiti da 1 quando li ho aggiunti di nuovo. Ora il mio id passa da 68 -> 92 e questo si blocca il mio codice.

Come reimpostare il valore IDENTITÀ?


Renderei il mio codice più resistente ai valori di identità mancanti. Una colonna di identità non garantisce la numerazione contigua e alla fine accadrà
Trubs

Risposte:


29

È possibile ripristinare il valore dell'identità di

DBCC CHECKIDENT('tableName', RESEED, 0)

Quindi la prossima volta che si inserisce in TableName, il valore dell'identità inserito sarà 1.

Quando elimini le righe dalla tabella, non reimposterà il valore Identità, ma continuerà ad aumentarlo. Proprio come è successo nel tuo caso.

Ora quando si tronca la tabella, reimposterà il valore Identity sul valore Seed originale della tabella.

Fare riferimento a: SQL SERVER - DELETE, TRUNCATE e RESEED Identity per un esempio dettagliato e alcune buone spiegazioni della differenza tra Troncare ed Elimina


22

Kin ti ha mostrato come ripristinare il valore IDENTITÀ, ma al di fuori di un ambiente di sviluppo quando stai veramente rimuovendo tutti i dati, perché devi farlo?

Spero che tu non abbia intenzione di mantenere una sequenza contigua di valori IDENTITÀ quando sei in produzione. E spero che tu non stia davvero scrivendo il tuo codice per codificare i valori IDENTITY. Se si tratta di valori ID significativi, è necessario interrompere l'utilizzo della proprietà IDENTITY.

Ci sono alcune cose che impediranno che ciò accada:

  • se durante una transazione viene assegnato un valore IDENTITÀ e la transazione viene ripristinata, il valore non viene "restituito" e il valore successivo sarà quello mai usato + 1.
  • se una riga viene successivamente eliminata, l'IDENTITÀ non ritorna più per colmare le lacune.
  • esiste un bug attivo in SQL Server 2012 che non verrà risolto fino a quando SQL Server 2014 non verrà mai corretto (a meno che non si utilizzi un flag di traccia non documentato e molto costoso) in base al quale un riavvio sembrerà eliminare fino a 1000 valori dalla colonna IDENTITÀ . Il bug su Connect suggerisce che questo è limitato agli eventi di failover che coinvolgono gruppi di disponibilità, ma posso assicurarti che il bug è molto più ampio di così.

In breve, se ti preoccupi delle lacune o desideri dare a questi valori un significato specifico, smetti di usare IDENTITÀ. Rilasciare e ricreare la tabella e quando è necessario eliminare i valori e ripetere la compilazione, eseguire un aggiornamento o eseguire un inserimento con valori hardcoded per quella colonna.

Per inciso, la chiave primaria e l'identità non sono la stessa cosa. Una colonna di identità non è una chiave primaria a meno che tu non la definisca esplicitamente come tale e puoi certamente avere una chiave primaria che non è una colonna di identità.


-4

Se devi solo eliminare le ultime righe che non hanno seguito il valore incrementale di un campo identità, esiste un modo semplice e sicuro:

  1. prima elimina gli ultimi record che sono stati "saltati"
  2. cambia il tipo di dati del tuo campo di identità (da int a bigint o viceversa)
  3. salva il tavolo
  4. aggiungere un nuovo record e verificare che assegni il numero del valore più alto + 1
  5. Sostituisci il tipo di dati del tuo campo identità, in base alle tue esigenze

e il gioco è fatto.


3
"Salva la tabella" non è un'istruzione significativa per SQL Server. La modifica dei tipi di dati può essere banale con meno di 100 righe ma potrebbe rivelarsi molto costosa per le tabelle di grandi dimensioni.
Michael Green,

2
Presumo che tu intenda in SSMS. Questo creerà una nuova tabella, copi tutte le righe in essa contenute, rilascerà la vecchia tabella e rinominerà quella nuova. E devi farlo due volte per riattivare il tipo di dati. Sta usando una mazza per rompere un dado.
Martin Smith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.