Cambiare Identità in SQL Server (Sempre!)

C’è qualche modo per cambiare l’identità di una colonna di identità in modo permanente? Utilizzando il comando DBCC CHECKIDENT sembra solo per impostare il last_value. Se la tabella è troncato tutti i valori vengono azzerati.

dbcc checkident ('__Test_SeedIdent', reseed, 1000)

select name, seed_value, increment_value, last_value
from sys.identity_columns
where [object_id] = OBJECT_ID('__Test_SeedIdent');

restituisce

name      seed_value  increment_value  last_value
-------------------------------------------------
idIdent   1           1                1000

Speravo che la sintassi come

alter table dbo.__Test_SeedIdent alter column idIdent [int] identity(1000,1) NOT NULL

esisterebbe.

È necessario creare una nuova colonna, spostare i valori di tutto, eliminare la colonna originale e rinominare il nuovo?

  • Esecuzione Profiler, vedo che MS crea una tabella temporanea, le copie dei dati su, poi cade la tabella esistente e rinomina la tabella temporanea. Probabilmente perché non ci può essere più di una colonna identity.
InformationsquelleAutor avenmore | 2010-01-26

 

4 Replies
  1. 16

    Da Libri Online:

    “Per modificare il valore di inizializzazione originale e reinizializzare le righe esistenti, è necessario eliminare e ricreare la colonna identity specificando il nuovo valore di inizializzazione. Quando la tabella contiene i dati, i numeri di identità vengono aggiunte le righe esistenti con specificato il seme e il valore di incremento. L’ordine in cui vengono aggiornate le righe non è garantito”.

  2. 3

    MSSQL non consente di aggiungere o modificare un’Identità a una colonna esistente via TSQL molto facilmente. Sarebbe necessario eliminare la colonna e aggiungerlo nuovamente. Inutile dire che questo può giocare a inferno con FK relazioni. È possibile farlo direttamente in enterprise manager. Tuttavia, che non sarà divertente se si ha a che fare questo per un SACCO di colonne.

    È necessario creare un nuovo
    colonna, spostare i valori in, drop
    la colonna originale e rinominare il
    di nuovo?

    Yup, e non dimenticate di correzione/aggiornamento di tutti gli indici, relazioni di chiave esterna, etc. che sono legati alla colonna

    • E non pensare nemmeno di fare questo a un grande tavolo!
    • Vorrei raccomandare in generale contro la modifica di qualsiasi produzione la tabella in Enterprise Manager. A volte copiare, eliminare, e incollare la tabella a compiere l’azione desiderata.
  3. 0

    “È necessario creare una nuova colonna, spostare i valori di tutto, eliminare la colonna originale e rinominare il nuovo?”

    Effettivamente in Enterprise Manager, quando si aggiunge una colonna ID di una tabella esistente (o modificare un INT PK campo per un INT PK ID), lo fa dietro le quinte.

  4. 0

    È possibile utilizzare DBCC CHECKIDENT('tablename', RESEED, seedvalue)

    esempio: DBCC CHECKIDENT('Customers',RESEED, 1350)
    eseguire DBCC CHECKIDENT('Customers') di nuovo per verificare se la corrente di semi di valore è stato impostato.

    Tuttavia, come indicato nella risposta precedente questo non modificare i valori contenuti nella colonna di identità. Cambia solo valore di inizializzazione, in modo che la riga successiva che è inserita avrà inizio con quel valore. Incremento di identità rimane lo stesso (non modificato) e non può essere modificato con il comando DBCC.

    • Solo che ripropone il problema, non fornisce una risposta.

Lascia un commento