как получить следующее значение autoincrement в sql

Я создаю приложение winform на c#.и, используя базу данных SQL.

у меня один столик,employee_master, который имеет столбцы типа Id, name, address и phone no. Id является автоматическим приращением, а все остальные типы данных -varchar.

Я использую этот код, чтобы получить следующее значение автоматического инкремента:

string s = "select max(id) as Id from Employee_Master";
SqlCommand cmd = new SqlCommand(s, obj.con);
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
int i = Convert.ToInt16(dr["Id"].ToString());
txtId.Text = (i + 1).ToString();

Я показываю на текстовом поле.

но когда последняя строка из таблицы удаляется, я все равно получаю то значение, которое недавно было удалено в поле

как я должен получить следующее значение автоинкремента?

8 ответов


чтобы получить следующее значение автоматического приращения от SQLServer:

это приведет к получению текущего значения автоматического приращения.

SELECT IDENT_CURRENT('table_name');

следующий автоинкремент значения.

SELECT IDENT_CURRENT('table_name')+1; 

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


попробуйте это:

SELECT IDENT_CURRENT('tbl_name') + IDENT_INCR('tbl_name');

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

Итак, если у вас есть 100 строк, и вы удалили строку 100. У вас будет 99 строк, но следующее число все равно будет 101.


max (id) даст вам максимальное число в списке PF employee_master

например, id = 10, 20, 100, поэтому max получит 100

но когда вы удаляете запись, она должна быть не 100

таким образом, вы все еще получаете 100 обратно

одна из важных причин для меня сказать, что это может быть проблема, потому что вы не используете order by id в своем запросе


Если вы используете Microsoft SQL Server. Используйте эту инструкцию для получения текущего значения идентификатора table. Затем добавьте начальное значение, которое вы указали во время разработки таблицы, если хотите получить следующий идентификатор.

SELECT IDENT_CURRENT(<TableName>)

select isnull((max(AddressID)+1),1) from AddressDetails

для MS SQL 2005 и выше:

Select Cast(IsNULL(last_value,seed_value) As Int) + Cast(increment_value As Int) As NextID
From sys.identity_columns
WHERE NAME = <Table_Name>

просто мысль, если то, что вы хотели был последним авто-номер, который вы вставили в уже открытое соединение, попробуйте использовать:

SELECT @@IDENTITY FROM...

от этой связи. Это лучший способ отслеживать то, что только что произошло на данном соединении, и избегать условий гонки с другими соединениями. Получение максимальной идентичности, как правило, не представляется возможным.