Максимум для автоинкрементного международного первичного ключа в SqlServer

Существует ли максимум? SQL Server начнет бросать SqlExceptions, когда максимум будет достигнут? Как Вы решаете его? (архивация?)

От ресурсов SQL Server I видят, что максимум 2,147,483,647. Я далек от этого, но мне было просто любопытно.

8
задан marc_s 19 February 2010 в 21:10
поделиться

3 ответа

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

use tempdb;

if OBJECT_ID('dbo.test', 'U') is not null drop table dbo.test

create table test
( id int identity not null,
  dummy int not null )
go

SET IDENTITY_INSERT dbo.test ON

insert into test(id, dummy) values(2147483647, 1)

SET IDENTITY_INSERT dbo.test OFF

insert into test(dummy) values(1)

ошибка:

(1 row(s) affected)
Msg 8115, Level 16, State 1, Line 8
Arithmetic overflow error converting IDENTITY to data type int.
Arithmetic overflow occurred.
6
ответ дан 5 December 2019 в 07:34
поделиться

Максимальное значение для int действительно равно 2 147 483 647.

Если вы попытаетесь превысить максимальный размер, вы получите эту ошибку:

Msg 8115, Level 16, State 1, Line 2 
Arithmetic overflow error converting IDENTITY to data type int. 
Arithmetic overflow occurred.

Если этот размер недостаточно велик, используйте bigint (9,223,372,036,854,775,807)

9
ответ дан 5 December 2019 в 07:34
поделиться

Максимум определяется типом данных, а не модификатором IDENTITY. Для столбца INT вы уже выяснили максимум. Если вам нужен тип данных с большим диапазоном, то BIGINT - очевидный выбор, и его вполне можно пометить IDENTITY.

  • TINYINT: от 0 до 255
  • SMALLINT: от -32768 до 32767
  • INT: от -2147483648 до 2147483647
  • BIGINT: -9223372036854775808 - 9223372036854775807

Я бы ожидал, что при попытке вставить строки после достижения максимума будет возникать ошибка, поскольку реализация IDENTITY все равно будет пытаться увеличиваться при каждой вставке.

Хотя, конечно, можно архивировать строки в другое хранилище данных и начать повторное использование идентификаторов (DBCC CHECKIDENT (jobs, RESEED, 0) сбросит счетчик), это не то, что SQL Server предлагает из коробки. Вам придется самостоятельно реализовать логику для этого, а также учесть, какие проблемы может принести повторное использование идентификаторов вашему приложению. Например, для веб-приложения, будут ли старые URL внезапно указывать на новые документы или возвращать 404 ошибку?

.
5
ответ дан 5 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: