Как вводить данные в SQL Server в поле Identity, без того, чтобы он оставил место пустым?

Проблема состоит в том, что я ввожу данные в базе данных с C# и поле id что у меня есть, identity, уже вставленная и совсем, но проблема - что, когда я ввожу новый реестр, остается последовательность, так как это autoincrementable пример: у меня есть 5 данных в базе данных 1, 2, 3, 4, 5 и то, что я хочу, состоит, в том, чтобы удалив 3, следующий реестр не был 6 но я возвратился в 3, которые я не оставил место. Или: какая-то идея как делать это, или поскольку он мог бы получать этот результат?

1
задан 25.01.2017, 07:53
0 ответов

Главный разум того, чтобы использовать поле autoincrementable - целостность информации, которая сохраняет в подмостках, этой формы, если ты удаляешь реестр, Id удаленный он вновь не будет введен (если только ты это не выразишь ясно с инструкцией SET IDENTITY_INSERT dbo.MyTable ON и потом с SET IDENTITY_INSERT dbo.Table OFF) что функционирует как будто ты говорил "дезактивировать Identity" потом "включать Identity", тогда, таким образом, всякий раз когда ты ввел новое поле, ты будешь должен возвращать Id дальше. Предполагая, что ты реализуешь INSERT через один SQLCommand:

int lastId = ...//lógica y consulta para obtener el último Id

using (var connection = new SqlConnection("CadenaDeConexion"))
{
    connection.Open();
    var query = "SET IDENTITY_INSERT dbo.Table ON; INSERT INTO dbo.Table (IdentityColumn) VALUES (@identityColumn); SET IDENTITY_INSERT dbo.Table OFF;";
    using (var command = new SqlCommand(query, connection)
    {
        command.Parameters.AddWithValue("@identityColumnValue", lastId);
        command.ExecuteNonQuery();
    }
}

Что, он теряет полностью чувство, так как функциональность Identity ты дезактивируешь ее, чтобы мочь манипулировать Id. Тогда, для чего он рекомендовал бы тебе, что колонна Id не будьте полем autoincrementable и функционируйте как хранение одного INT, или BIGINT, например:

using (var connection = new SqlConnection("CadenaDeConexion"))
{
    connection.Open();
    var query = "INSERT INTO Tabla (Id, Valor) VALUES((SELECT MAX(Id) + 1 FROM Tabla), 'Descripción del campo' )";
    using (var command = new SqlCommand(query, connection)
    {
        command.ExecuteNonQuery();
    }
}

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

Сейчас, понимая предыдущий контекст, чтобы возвращать Ids потерянные, ты можешь получать это со следующей консультацией, предполагая, что у нас есть так называемая таблица Users и поле autoincrementable называется UserId:

;WITH TablaIdsPerdidos (IdsPerdidos, maxid)
AS
(
    SELECT 1 AS IdPerdido, (SELECT MAX(UserId) FROM Users)
    UNION ALL
    SELECT IdsPerdidos + 1, maxid FROM TablaIdsPerdidos
    WHERE IdsPerdidos < maxid
)
SELECT IdsPerdidos
FROM TablaIdsPerdidos TP
LEFT OUTER JOIN Users U on U.UserId = TP.IdsPerdidos
WHERE U.UserId IS NULL

Сейчас, только ты был бы должен получать первого Id возвращенный в консультации и строить функциональность с первым примером SET IDENTITY_INSERT dbo.MyTable ON/OFF если дело в том, что ты так это желаешь.

1
ответ дан 03.12.2019, 17:30