Я видалив деякі записи з таблиці в базі даних SQL Server. Тепер ідентифікатор переходить з 101 до 1200. Я хочу видалити записи ще раз, але я хочу, щоб ідентифікатори повернулися до 102. Чи є спосіб це зробити на SQL Server?
Я видалив деякі записи з таблиці в базі даних SQL Server. Тепер ідентифікатор переходить з 101 до 1200. Я хочу видалити записи ще раз, але я хочу, щоб ідентифікатори повернулися до 102. Чи є спосіб це зробити на SQL Server?
Відповіді:
Запустіть таку команду, щоб повторно переставити mytable, починаючи з 1:
DBCC CHECKIDENT (mytable, RESEED, 0)
Про це читайте в «Книгах на лінії» (довідка BOL, SQL). Також будьте обережні, щоб у вас не було записів, вищих за насіння, яке ви встановлюєте.
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
якщо число = 0, то в наступному вставці поле автоматичного збільшення буде містити значення 1
якщо число = 101, то в наступному вставці поле автоматичного збільшення буде містити значення 102
Деякі додаткові відомості ... Можуть бути корисними Вам
Перед тим, як надати автоматичний приріст number
у вищезазначеному запиті, ви повинні переконатися, що стовпець автоматичного збільшення вашої існуючої таблиці містить значення менше number
.
Щоб отримати максимальне значення стовпця (ім'я стовпця) з таблиці (table1), ви можете використовувати наступний запит
SELECT MAX(column_name) FROM table1
напівдоказний:
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, спробуйте це:
ALTER TABLE tablename AUTO_INCREMENT = 1
Видалення та повторне використання всіх таблиць у базі даних.
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.
На основі прийнятої відповіді для тих, хто зіткнувся з подібним питанням, з повною кваліфікаційною схемою:
( [MyDataBase].[MySchemaName].[MyTable]
) ... призводить до помилки, вам потрібно бути в контексті цієї БД
Тобто, помилка призведе до наступного:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
Закрийте замість назви повноцінної таблиці таблицю одинарними лапками:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
У кількох відповідях рекомендується використовувати твердження приблизно такого:
DBCC CHECKIDENT (mytable, RESEED, 0)
Але в ОП сказали, що "видалено деякі записи", які можуть бути не всіма, тому значення 0 не завжди є правильним. Інша відповідь запропонувала автоматично знайти максимальне значення струму та перевстановити його, але це зіткнеться з проблемою, якщо в таблиці немає записів, і таким чином max () поверне NULL. Коментар пропонується використовувати просто
DBCC CHECKIDENT (mytable)
скинути значення, але інший коментар правильно вказав, що це лише збільшує значення до максимуму, що вже є в таблиці; це не зменшить значення, якщо воно вже вище максимального в таблиці, що саме хотіла зробити ОП.
Краще рішення поєднує ці ідеї. Перший CHECKIDENT скидає значення до 0, а другий повертає його до найвищого значення, що знаходиться в таблиці, якщо у таблиці є записи:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
Як зазначається кілька коментарів, переконайтеся, що в інших таблицях немає сторонніх ключів, що вказують на видалені записи. Інакше ці іноземні ключі будуть вказувати на записи, які ви створюєте після повторної повторної роботи таблиці, що майже точно не те, що ви мали на увазі.
Я хочу додати цю відповідь, оскільки- DBCC CHECKIDENT
Assach викличе проблеми з продуктом, коли ви використовуєте схеми для таблиць. Використовуйте це, щоб бути впевненим:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
Якщо ви хочете перевірити успішність операції, використовуйте
SELECT IDENT_CURRENT(@Table);
який слід вивести 0
у наведеному вище прикладі.
Ти взагалі не хочеш цього робити. Повторне дослідження може створити проблеми з цілісністю даних. Це дійсно лише для використання в системах розробки, де ви стираєте всі тестові дані і починаєте заново. Він не повинен використовуватися у виробничій системі у випадку, якщо всі пов'язані записи не були видалені (не кожна таблиця, яка має бути у зовнішньому ключі, є!). Ви можете створити безлад, роблячи це, особливо якщо ви хочете робити це регулярно після кожного видалення. Неприємно турбуватися про прогалини у ваших значеннях поля ідентичності.
Як що до цього?
ALTER TABLE `table_name`
MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
Це швидкий і простий спосіб змінити автоматичний приріст на 0 або будь-яке число, яке ви хочете. Я зрозумів це, експортувавши базу даних і сам прочитав код.
Ви також можете написати це так, щоб зробити його однорядковим рішенням:
ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;