2013-11-27 5 views
0

Я использую 3-4 таблицы и использую автоинкремент на primaryk ey во всех них. Я хочу, чтобы все таблицы, чтобы начать с 1Auto-increment SQL Server

Для примера student начинается таблица идентификаторов от 1, и Registration таблицы начинается с 1.

Прямо сейчас, что происходит с шагом авто начать с последним идентификатором студента таблицы. Например, например, LastRow ID в таблице учеников равен 100, поэтому Registeration начнется с 101. Я хочу, чтобы он начинал с 1, как это сделать.

+0

Вы что-то пробовали? Почему вы пытаетесь это сделать? Я думаю, что все таблицы пустые, потому что, если уже есть какое-то значение, в первом вставке уже есть первичный ключ со значением 1, поэтому вы не можете повторить это значение. – Yaroslav

+0

- стол студента пуст? – sumit

ответ

0

Как сказал Эйнав, этот вопрос следует рассматривать с осторожностью!

Если ваша таблица учеников пуста, и вы пытаетесь сбросить счетчики из-за тестирования или из-за ежегодного уничтожения базы данных и т. Д., То вы можете использовать команду DBCC CHECKIDENT (если вы используете MS SQL Server) или вы можете использовать таблицу alter (auto_increment) для MySql http://dev.mysql.com/doc/refman/5.0/en/alter-table.html.

Но будьте осторожны, так как любые зависимости от внешнего ключа также должны быть сброшены - вы можете столкнуться со всеми неприятностями.

Вот быстрый тест сценарий:

--Test variables & environment 
DECLARE @TimeParam AS DATETIME 
CREATE TABLE #Downtime (ID int identity, initial varchar(1)) 
INSERT INTO #Downtime VALUES('a') 
INSERT INTO #Downtime VALUES('b') 
INSERT INTO #Downtime VALUES('c') 
INSERT INTO #Downtime VALUES('d') 
INSERT INTO #Downtime VALUES('e') 
INSERT INTO #Downtime VALUES('f') 
INSERT INTO #Downtime VALUES('g') 
INSERT INTO #Downtime VALUES('h') 
INSERT INTO #Downtime VALUES('i') 
INSERT INTO #Downtime VALUES('j') 

--Queries 
DBCC CHECKIDENT (#Downtime) 
SELECT ID, initial FROM #Downtime 
DELETE FROM #Downtime 
DBCC CHECKIDENT (#Downtime, RESEED, 0) 
INSERT INTO #Downtime VALUES('k') 
SELECT ID, initial FROM #Downtime 
DROP TABLE #Downtime 

--results (first select) 
ID initial 
1 a 
2 b 
3 c 
4 d 
5 e 
6 f 
7 g 
8 h 
9 i 
10 j 

--results (second select) 
ID initial 
2 j 

В вашем случае вы будете использовать: DBCC CHECKIDENT ('Студент', переустановку, 0);

Снова выполните эту команду с осторожностью и проверьте все ссылки на этот первичный ключ ПЕРЕД началом выполнения команды. Убедитесь, что вы также сделали резервные копии базы данных!

+1

Повторная установка 1, первая вставка добавит значение идентификатора 2, а не 1. – Yaroslav

+0

Спасибо @ Ярослав, я, должно быть, работал над автопилотом ... скопируйте и вставьте ошибку - ответ изменился. – Mack

1

Я не думаю, что это возможно в большинстве СУБД. Даже если это, я бы не советовал вам это сделать - если уже есть строки в таблице, вы должны начать с MAX_ROWS + 1.

1

, чтобы начать семена от 1 использования:

DBCC CHECKIDENT (students, RESEED, 0) 

примечание: вы должны быть уверены, что стол пуст, если вы делаете это

3

Если у вас уже есть значения (таблицы не пусты), то это невозможно. Вы можете очистить все таблицы и запустить DBCC CHECKIDENT command сбросить значение вашего автоинкремента первичного ключа и перезапускать из 1.

DBCC CHECKIDENT ("YourTableNameHere", RESEED, number); 

Если number = 0, то в следующей вставке поле автоматического приращения будет содержать значение 1

Если number = 101, то в следующей вставке поле приращения автоматически будет содержать значение, 102

Но следует помнить, что эта команда просто сбрасывает значение столбца идентификации, он не проверяет наличие конфликтов. Я имею в виду, если значение 1 уже существует, то при попытке вставить в эту таблицу будут ошибки.