2010-07-02 3 views

ответ

3

Я тестировал, что говорит Giogri, и если вы включите спецификацию Identity (по крайней мере, в 2008 году, возможно, и другие версии), после того, как таблица имеет строки, DB начнет нумерацию с наивысшим целым значением. Если у вас есть одна строка со значением 100 в качестве значения столбца, тогда включите Identity, следующая вставка будет равна 101. Даже с идентификационным семенем, указанным как 1. Не было того, чего я ожидал бы, но того, что произошло.

В дополнение к SET IDENTITY INSERT, есть также команда reseed. DBCC CHECKIDENT, который сбросит ваши значения идентичности до того, что вы укажете.

Учитывая, что включение спецификации идентификации действительно начинается с наивысшего целого числа в столбце, кто-то, возможно, либо использовал SET IDENTITY_INSERT, либо сделал DBCC CHECKIDENT.

Самый быстрый способ resequence, как Andomar говорит, падение/обновить столбец как этого

ALTER TABLE tbl 
DROP COLUMN ident_column 
GO 
alter TABLE tbl 
ADD ident_column int IDENTITY 

SET IDENTITY_INSERT документы: http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx
DBCC CHECKIDENT документы: http://msdn.microsoft.com/en-us/library/aa258817(SQL.80).aspx

+0

Cocker на самом деле мой код или код моей команды не отвечали за беспорядок, но мы просто хотели знать, почему это произошло, чтобы избежать этого в будущем. Я думаю, что в эти дни произошла миграция сервера базы данных, и тогда кто-то перепутал ситуацию. – TheVillageIdiot

2

Столбец идентичности не совпадает с первичным ключом. Если вы вставляете некоторые значения в столбец id перед установкой его в идентификатор, тогда он может генерировать те же значения, которые вы вставили вручную.

1

Идентификация - это просто новое значение по умолчанию. Уникальность обеспечивается ограничениями primary key и unique.

Дубликаты в столбце идентичности можно объяснить:

  • Определение столбца не содержит по умолчанию идентичности в какой-то момент времени (как говорит Гиорги)
  • Опция SET IDENTITY INSERT TableName ON была включена в какой-то момент во время

Чтобы устранить эту ситуацию, снимите и заново создайте столбец идентификатора.

0

Если личность не участвует в отношениях , да, вы можете сбросить и воссоздать его. Если есть отношения, ситуация более сложная.

Во-первых, вам нужно заново заново заново закрепить запиленные идентификационные номера идентификационных номеров и вставить их в таблицу и получить для них новую идентификацию. Вам нужно идентифицировать дочерние записи для идентификаторов, которые повторяются, а затем выяснить, какие из них идут на какие из двух новых идентификаторов. Это самая сложная часть и может быть даже невозможна.

Как только это будет сделано, вы обновите эти дочерние записи до новых идентификаторов. то вы удаляете старые родительские записи, когда нет дочерних записей. Если вы (и вы, я имею в виду, что компания не обязательно программист, иногда это то, что могут делать только пользователи) не может определить, к какой родительской записи идет дочерняя запись, затем отбросьте эти дочерние записи, а затем отпустите старый родитель записей.Если у вас есть дочерние записи, которые вы не хотите удалять, вам нужны данные для исторической отчетности о расходах или некоторые такие вещи, а затем сохраните одну из старых родительских записей. В этом случае я, вероятно, изменил бы одну из родительских записей, чтобы сказать «Неизвестно» как имя пользователя или любое другое значение, которое у вас есть в таблице, которое также идентифицирует запись, а затем удаляет другой дублированный идентификатор.

Удачи, проблемы с целостностью данных, как это трудно исправить. Также я бы выполнил поиск в базе кода для фразы «set indentity_insert», чтобы убедиться, что недальновидный программист избегает правильного использования поля идентификации. Вы не хотите, чтобы эта проблема повторялась. Если вы найдете этот код и знаете, кто сделал это с вами (контроль источника - это замечательная вещь), я бы предложил, чтобы это был лучший человек, который назначил исправление любых проблем с целостностью данных. Пройдите через проблему устранения проблемы целостности данных, и вы будете гораздо более осторожным программистом в будущем.

1

Пример дубликата значения в столбце идентификаторов с использованием IDENTITY_INSERT «» RECNO:

create table names(RecNo INT IDENTITY (1,1), name VARCHAR(50)) 
insert into names(name) VALUES ('maria') 
insert into names(name) VALUES ('maria2') 

set IDENTITY_INSERT names ON 
insert into names(RecNo, name) VALUES (1, 'maria3') 
set IDENTITY_INSERT names OFF 

select * from names 

RecNo name 
1   maria 
2   maria2 
1   maria3 

Когда IDENTITY_INSERT установлен, то целесообразно, чтобы не изменить его (чтобы явные значения). Пример дублирующегося значения в столбце «RecNo» с идентификационным номером, заново установив семя:

create table names(RecNo INT IDENTITY (1,1), name VARCHAR(50)) 
insert into names(name) VALUES ('maria') 
insert into names(name) VALUES ('maria2') 

DBCC CHECKIDENT(names, RESEED, 1) 
insert into names(name) VALUES ('maria3') 
set IDENTITY_INSERT names OFF 

select * from names; 

RecNo name 
1   maria 
2   maria2 
2   maria3 
Смежные вопросы