Ho eliminato alcuni record da una tabella in un database di SQL Server. Ora gli ID vanno da 101 a 1200. Voglio cancellare di nuovo i record, ma voglio che gli ID tornino a 102. C'è un modo per farlo in SQL Server?
Ho eliminato alcuni record da una tabella in un database di SQL Server. Ora gli ID vanno da 101 a 1200. Voglio cancellare di nuovo i record, ma voglio che gli ID tornino a 102. C'è un modo per farlo in SQL Server?
Risposte:
Immettere il comando seguente per ridimensionare mytable per iniziare da 1:
DBCC CHECKIDENT (mytable, RESEED, 0)
Leggi a riguardo nella documentazione on line (BOL, guida di SQL). Fai anche attenzione a non avere record più alti del seme che stai impostando.
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
se numero = 0, nel successivo inserimento il campo di incremento automatico conterrà il valore 1
se numero = 101, nel successivo inserimento il campo di incremento automatico conterrà il valore 102
Alcune informazioni aggiuntive ... Potrebbe esserti utile
Prima di fornire l'incremento automatico number
nella query precedente, devi assicurarti che la colonna di incremento automatico della tabella esistente contenga valori inferiori number
.
Per ottenere il valore massimo di una colonna (nome_colonna) da una tabella (tabella1), è possibile utilizzare la seguente query
SELECT MAX(column_name) FROM table1
semi idiota:
declare @max int;
select @max = max(key) from table;
dbcc checkident(table,reseed,@max)
http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete
Se stai usando MySQL, prova questo:
ALTER TABLE tablename AUTO_INCREMENT = 1
Elimina e ridisegna tutte le tabelle in un database.
USE [DatabaseName]
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" -- Disable All the constraints
EXEC sp_MSForEachTable "DELETE FROM ?" -- Delete All the Table data
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" -- Enable All the constraints back
-- You may ignore the errors that shows the table without Auto increment field.
Sulla base della risposta accettata, per coloro che hanno riscontrato un problema simile, con qualifica di schema completa:
( [MyDataBase].[MySchemaName].[MyTable]
) ... provoca un errore, devi essere nel contesto di quel DB
Cioè, quanto segue genererà un errore:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
Racchiudere invece il nome completo della tabella con virgolette singole:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
Diverse risposte raccomandano di usare una frase simile a questa:
DBCC CHECKIDENT (mytable, RESEED, 0)
Ma l'OP ha detto "cancellato alcuni record", che potrebbero non essere tutti, quindi un valore di 0 non è sempre quello giusto. Un'altra risposta ha suggerito di trovare automaticamente il valore corrente massimo e di eseguire il reseeding su quello, ma ciò si traduce in un problema se non ci sono record nella tabella e quindi max () restituirà NULL. Un commento suggerito usando semplicemente
DBCC CHECKIDENT (mytable)
per reimpostare il valore, ma un altro commento ha affermato correttamente che ciò aumenta il valore al massimo già nella tabella; questo non ridurrà il valore se è già superiore al massimo nella tabella, che è ciò che l'OP voleva fare.
Una soluzione migliore combina queste idee. Il primo CHECKIDENT reimposta il valore su 0 e il secondo reimposta il valore più alto attualmente nella tabella, nel caso in cui vi siano record nella tabella:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
Come indicato da più commenti, assicurarsi che non vi siano chiavi esterne in altre tabelle che puntano ai record eliminati. Altrimenti quelle chiavi esterne punteranno ai record che crei dopo il reseeding della tabella, che quasi sicuramente non è quello che avevi in mente.
Voglio aggiungere questa risposta perché l' DBCC CHECKIDENT
approccio produrrà problemi quando si usano schemi per le tabelle. Usa questo per essere sicuro:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
Se si desidera verificare il successo dell'operazione, utilizzare
SELECT IDENT_CURRENT(@Table);
che dovrebbe produrre 0
nell'esempio sopra.
Non vuoi farlo in generale. Reseed può creare problemi di integrità dei dati. È davvero solo per l'uso su sistemi di sviluppo in cui si stanno cancellando tutti i dati di test e si ricomincia da capo. Non dovrebbe essere utilizzato su un sistema di produzione nel caso in cui tutti i record correlati non siano stati eliminati (non tutte le tabelle che dovrebbero essere in una relazione di chiave esterna lo sono!). Puoi creare un casino facendo questo e specialmente se intendi farlo regolarmente dopo ogni eliminazione. È una cattiva idea preoccuparsi delle lacune nei valori del campo identità.
Che dire di questo?
ALTER TABLE `table_name`
MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
Questo è un modo rapido e semplice per modificare l'incremento automatico in 0 o in qualsiasi numero desiderato. L'ho capito esportando un database e leggendo il codice da solo.
Puoi anche scriverlo in questo modo per renderlo una soluzione a riga singola:
ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;