SQL Server veritabanındaki bir tablodan bazı kayıtları sildim. Şimdi kimlik 101'den 1200'e gider. Kayıtları tekrar silmek istiyorum, ancak kimliklerin 102'ye geri dönmesini istiyorum. SQL Server'da bunu yapmanın bir yolu var mı?
SQL Server veritabanındaki bir tablodan bazı kayıtları sildim. Şimdi kimlik 101'den 1200'e gider. Kayıtları tekrar silmek istiyorum, ancak kimliklerin 102'ye geri dönmesini istiyorum. SQL Server'da bunu yapmanın bir yolu var mı?
Yanıtlar:
1'den başlayarak mytable'ı yeniden göndermek için aşağıdaki komutu verin:
DBCC CHECKIDENT (mytable, RESEED, 0)
Bu konuyu on line kitaplarda (BOL, SQL yardımı) okuyun. Ayrıca, ayarladığınız tohumdan daha yüksek kayıtlara sahip olmadığınıza da dikkat edin.
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
sayı = 0 ise, sonraki eklemede otomatik artış alanı 1 değerini içerir
sayı = 101 ise, sonraki eklemede otomatik artış alanı 102 değerini içerecektir
Bazı ek bilgiler ... Sizin için faydalı olabilir Yukarıdaki sorguda
otomatik artış vermeden önce number
, mevcut tablonuzun otomatik artış sütununda bundan daha az değerler bulunduğundan emin olmalısınız number
.
Bir sütundan (sütun_adı) bir tablodan (tablo1) maksimum değeri almak için aşağıdaki sorguyu kullanabilirsiniz
SELECT MAX(column_name) FROM table1
yarı aptal geçirmez:
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
MySQL kullanıyorsanız, şunu deneyin:
ALTER TABLE tablename AUTO_INCREMENT = 1
Veritabanındaki tüm tabloları silin ve yeniden gönderin.
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.
Şema kalifikasyonu ile benzer bir sorunla karşılaşanlar için kabul edilen cevaba dayanarak:
( [MyDataBase].[MySchemaName].[MyTable]
) ... bir hatayla sonuçlanırsa, o DB bağlamında olmanız gerekir
Yani, aşağıdakiler bir hata verecektir:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
Tam olarak nitelenmiş tablo adını tek tırnak işareti içine alın:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
Birkaç cevap böyle bir ifadeyi kullanmanızı önerir:
DBCC CHECKIDENT (mytable, RESEED, 0)
Ancak OP, hepsi olmayabilir "bazı kayıtları sildi" dedi, bu nedenle 0 değeri her zaman doğru değildir. Başka bir cevap, maksimum akım değerini otomatik olarak bulmayı ve bu değere yeniden göndermeyi önerdi, ancak tabloda hiç kayıt yoksa sorun çıkar ve max () NULL döndürür. Basitçe önerilen bir yorum
DBCC CHECKIDENT (mytable)
değeri sıfırlamak için, ancak başka bir yorum, bunun yalnızca değeri zaten tablodaki maksimum değere yükselttiğini doğru bir şekilde belirtti; bu zaten tabloda maksimumdan daha yüksekse, OP'nin yapmak istediği değeri azaltmaz.
Daha iyi bir çözüm bu fikirleri birleştirir. İlk CHECKIDENT değeri 0 olarak, ikincisi de tabloda kayıt olması durumunda değeri tablodaki en yüksek değere sıfırlar:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
Birden fazla yorumun belirttiği gibi, diğer tablolarda silinen kayıtları gösteren yabancı anahtar olmadığından emin olun. Aksi takdirde, bu yabancı anahtarlar, tabloyu yeniden boyutlandırdıktan sonra oluşturduğunuz kayıtlara işaret edecektir;
DBCC CHECKIDENT
Tablolar için şemalar kullandığınızda -approach ürün sorunları olacaktır çünkü bu yanıtı eklemek istiyorum . Emin olmak için bunu kullanın:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
Operasyonun başarısını kontrol etmek istiyorsanız,
SELECT IDENT_CURRENT(@Table);
0
yukarıdaki örnekte çıktı alınmalıdır .
Bunu genel olarak yapmak istemezsiniz. Reseed veri bütünlüğü sorunları yaratabilir. Gerçekten sadece tüm test verilerini sildiğiniz ve baştan başladığınız geliştirme sistemlerinde kullanım içindir. İlgili tüm kayıtların silinmemesi durumunda üretim sisteminde kullanılmamalıdır (yabancı anahtar ilişkisinde olması gereken her tablo değildir!). Bunu yaparken bir karmaşa yaratabilirsiniz ve özellikle her silme işleminden sonra düzenli olarak yapmak istiyorsanız. Kimlik alanı değerlerinizdeki boşluklar konusunda endişe etmek kötü bir fikirdir.
Peki buna ne dersin?
ALTER TABLE `table_name`
MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
Bu, otomatik artışı 0'a veya istediğiniz herhangi bir sayıya değiştirmenin hızlı ve basit bir yoludur. Ben bir veritabanı ihraç ve kodu kendim okuyarak bunu anladım.
Tek satırlık bir çözüm yapmak için şöyle de yazabilirsiniz:
ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;