Будут ли уникальные Rids когда -нибудь «переполнение»?

StackOverflow https://stackoverflow.com/questions/1976964

Вопрос

Я делаю приложение для запуска на SQL Server и PostgreSQL, поэтому я задаю этот вопрос о них обоих.

Что происходит всякий раз, когда вы создаете уникальный первичный ключ (используя последовательность или тип автоматического интеграмента), и вы достигли более 4 миллиардов записей (32 бита)? Я не говорю, что в нашей таблице будет 4 миллиарда записей, а скорее, что 4 миллиарда записей были созданы только из -за увеличения. Поэтому, даже если я удалил 3,9 миллиарда этих записей, мои Rids все еще находятся в диапазоне 4 миллиардов. Так что же происходит? Это повышает точность до 64 -битного или переворачивается до 0 или просто выплевывает очень критическую ошибку? Должен ли я беспокоиться о том, что даже 64 -битный избавление может в конечном итоге переполнено?

Кроме того, как я могу бороться с этим? Есть ли какой -то вариант очистки или инструмент? Должен ли я просто создавать свои собственные вещи каждый год или около того, чтобы полностью перестраивать стол, чтобы получить последовательные Rids? (И, таким образом, также касайтесь многих других таблиц, которые используют эти Rids, являются иностранными ключами)

Это было полезно?

Решение

PostgreSQL по умолчанию будет ошибкой, а не переполнено:

# create sequence willyouwrap;
CREATE SEQUENCE
# select setval('willyouwrap', 9223372036854775807);
       setval        
---------------------
 9223372036854775807
(1 row)
# select nextval('willyouwrap');
ERROR:  nextval: reached maximum value of sequence "willyouwrap" (9223372036854775807)

От документов:

Последовательности основаны на арифметике Bigint, поэтому диапазон не может превышать диапазон восьми-байтового целого числа (-9223372036854775808 до 922337203685475807). На некоторых более старых платформах не может быть поддержки компилятора для восьми байтовых целых чисел, и в этом случае последовательности используются регулярная арифметика целочисленного целого числа (диапазон от -2147483648 до +2147483647).

Тем не менее, вы можете сделать это циклом:

Вариант цикла позволяет последовательности обернуться, когда максимальное значение или MinValue достигнуто восходящей или нисходящей последовательности соответственно. Если предел достигнут, сгенерированным следующим числом будет MinValue или MaxValue, соответственно.

Если цикл не указан, какие -либо вызовы в NextVal после того, как последовательность достигла своего максимального значения, вернет ошибку. Если ни один цикл или отсутствие цикла не указано, цикл не является дефолтом.

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

Другие советы

На SQL Server: это зависит от типа столбца RID. Внутренняя идентификация может увеличить, но не будет назначена столбцу Stoarge:

CREATE TABLE [t1] (
[tid] int IDENTITY (2147483647, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')

Эта ошибка запускает:

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

Но числовой столбец с достаточным количеством хранения будет просто отлично:

CREATE TABLE [t1] (
[tid] numeric(38,0) IDENTITY (2147483647, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')

Точно так же Bigint будет проклеить на 2 ^^ 63-1:

CREATE TABLE [t1] (
[tid] bigint IDENTITY (9223372036854775807, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')

Но числовой столбец с достаточным хранением будет успешным:

CREATE TABLE [t1] (
[tid] numeric(38,0) IDENTITY (9223372036854775807, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top