Сбросить первичный ключ (int как личность) - PullRequest
1 голос
/ 21 февраля 2009

У меня есть таблица с первичным ключом в виде bigint (свойство identity равно Yes и начинается с 1 по 1). Эта таблица находится в производстве и обновляется ежедневно: много удалений и вставок.

Проблема в том, что этот ключ становится слишком большим сейчас с 8 цифрами. В конце концов я беспокоюсь о переполнении.

К счастью, этот ключ не используется в качестве внешних ключей для любых других таблиц. Он просто используется для идентификации строки в таблице. Поэтому я могу безопасно сбросить значения ключей, начиная с 1, может быть, один раз в год.

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

Не уверен, есть ли встроенная процедура sp_xxx, доступная в Microsoft SQL 2005 для выполнения этой задачи: просто сбросить первичный ключ в последовательности, начинающейся с 1, не затрагивая другие данные столбца? Или любое другое простое решение?

Ответы [ 3 ]

8 голосов
/ 21 февраля 2009

Максимальное значение для bigint составляет 9,223,372,036,854,775,807 . Если бы вы получили до 8 цифр в день, вам все равно потребуется 10 11 дней, чтобы достичь максимума. Это как 25 миллионов лет.

Предполагая, что вы все еще хотите сбросить столбец, первый вопрос, который у меня возникает: важен ли порядок строк? То есть вы полагаетесь на тот факт, что строка 1000 предшествует 1100, скажем, для хронологического или иным образом абсолютного упорядочения? Если нет, то это легко: удалите столбец и добавьте его снова. Эй, Presto, новые ценности.

Если вам нужно поддерживать порядок, вам нужно сделать это немного более осторожно:

  1. Блокировка стола;
  2. Измените тип, чтобы он больше не увеличивался автоматически;
  3. Создать новый столбец. Лучше всего пока у него нет индексов, поскольку обновление индекса замедляет вставки;
  4. Заполните значения во втором цикле, увеличивающем счетчик (например, трюк rownum в SQL Server), упорядочивая вставки в соответствии с исходным порядком;
  5. Заменить старый столбец новым;
  6. Сброс автоинкремента и статуса первичного ключа.
2 голосов
/ 21 февраля 2009

создать новую таблицу с другим именем, но точно такими же столбцами. сделать вставку в new_table выберите из old_table. затем удалите старую таблицу и переименуйте новую таблицу.

0 голосов
/ 21 февраля 2009

Если вы используете BIGINT, вы даже близко не переполните его. Если вы только на 10 000 000 через год, вы могли бы пройти миллион лет и все еще быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...