2013-10-12 5 views
-2

У меня есть таблица с тремя столбцами ID, Name, Designation, где столбец ID является первичным ключом и его идентичность спецификации включена и его семена на 1.Как остановить первичный ключ идентификации столбца пропуска отсутствующих значений

Предположим, у меня есть 10 строк в стол. Через значения последовательности из ID колонны в последовательности

1,2,3......10. 

и пользователь удаляет десятые строки затем вставляет новую строку Я вставка будет иметь 11 как значение ID столбца. Как сделать, чтобы увеличить значение последней строки? Я имею в виду, что я хочу «10» как значение новой строки как строки до того, как она будет иметь столбец ID значение как 9.

Я не хочу использовать MAX функцию SQL Server, я хочу, чтобы она автоматически увеличивалась , Есть ли способ достичь этого?

P.S: Я использую фреймворк Entity для вставки значений в БД.

+9

Вы ** НЕ МОЖЕТЕ сделать это ** и ** если вы! ** Если 'ID = 10' был выдан ранее, это ** ужасно плохой идеей« переработать »это значение! У SQL Server нет никаких положений для этого, и в этом нет необходимости. Просто привыкните к этому - 'INT IDENTITY' будет ** никогда ** быть полностью последовательным - будут пробелы (и это ** NO PROBLEM ** с точки зрения базы данных) –

+4

, но его нет в базе данных больше. –

+0

Ваша цель здесь? Если ID # 5 удален, вы хотите, чтобы следующая вставка была равна 5, или вы хотите, чтобы 6-10 уменьшалось, или это нормально, чтобы удалить из середины, а не конец? Независимо от того, вы не сможете сделать это с помощью EF и идентификаторов, но это поможет точно узнать, что вы пытаетесь выполнить. –

ответ

0

Для мужчине или женщине, которая любит жить опасно, возможно , хотя не рекомендуется для повторного заполнения столбца идентификации.

TSQL является

dbcc checkident ([tableName], reseed, [previousHighestID]) 

Учитывая следующей таблице:

create table x (a int identity(1,1), y varchar(max)) 

Entity рамки:

using (var context = new XContext()) 
{ 
    context.Database.SqlCommand("insert into x select 'abc'");//id 1 
    context.Database.SqlCommand("insert into x select 'cba'");//id 2 
    context.Database.SqlCommand("delete from x where a = 2");//delete id 2 
    context.Database.SqlCommand("declare @identMax int; select @identMax = max(a) from x; dbcc checkident (x, reseed, @identMax)"); 
    //reseed identity to 1 (so next insert will be id 2) 
    context.Database.SqlCommand("insert into x select 'def'");//id 2 (again!) 
    var X = context.X.SqlQuery("select * from x").ToList();  
} 

На самом деле не беспокоиться о нескольких отсутствующих значений. Столбец int или bigint может представлять множество значений.

Я вспоминаю Джека Handy глубокой мысли:

«Если вы уронили ключи в расплавленную лаву просто позвольте им идти 'причина, человек, они ушли.»

-1

, если у вас есть столбец идентификаторов вы не можете сделать это, unlees вставка вы хотите сделать это один раз вещь .. то вы можете попробовать:

SET IDENTITY_INSERT XXX ON 
GO 

-- INSERT WITH THE IDENTITY VALUE YOU WANT 

SET IDENTITY_INSERT XXX OFF 
GO 
+2

Я вставляю значения в БД, используя Entity framework asp.net. –

+1

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

+0

Я сохраняю некоторые значения, которые имеют ID конкатенированный. и я генерирую их значение в коде, используя функцию max для столбца ID EF. –

0

вы можете сделать это вручную.

Шаг 1: Удалить IsIdentity = «ON» в первичном ключе (или Set IsIdentity в OFF)

шага 2: Получить последнюю строку в вашей таблице с помощью EF запроса и получить первичный ключ значение столбца при каждом сохранении данных в базе данных. (Load most recent related entity record on a list of entities in a single query)

шаг 3: А теперь, если значения первичного ключа последняя строка 9, то вы можете добавить +1 с этим значением и сохранить новые значения с PrimaryKey значений столбцов 10,

+2

Если вы это сделаете, вам необходимо использовать транзакцию, и вам нужно заблокировать таблицу с помощью первого выбора, чтобы другие элементы выбора не получали одинаковое значение. – Szymon

0

Единственный раз, когда вы хотите перерабатывать поле идентификатора/автоматического приращения, - это когда значение этого поля почти исчерпано или значения сильно фрагментированы.

Смежные вопросы