Изменить тип данных столбца огромной таблицы PK

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

  •  07-07-2019
  •  | 
  •  

Вопрос

Теперь, когда мы исчерпали емкость int в столбце PK (это IDENTITY ), я бы хотел сделать это для bigint , но простой ALTER TABLE кажется неспособным обработать этот большой размер таблицы. Поэтому мой вопрос: как мне изменить тип столбца PK, сохранив фактические значения на месте, и нужно ли мне также изменять таблицы ссылок?

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

Решение

В дополнение к предложению KLE могут помочь следующие запросы:

Чтобы отключить все ограничения для таблиц, которые ссылаются на oldTable, попробуйте выполнить вывод следующего запроса:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' NOCHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

Чтобы переместить все данные в новую таблицу, с изменением поля попробуйте следующее:

INSERT INTO newTable
SELECT CONVERT(BIGINT, ID) AS ID, COL1, COL2, ..., COLN
FROM oldTable

Чтобы удалить старую таблицу:

DROP TABLE oldTable

Чтобы переименовать новую таблицу в старое имя:

sp_rename newTable, oldTable

Чтобы снова включить все ограничения для таблиц, которые ссылаются на oldTable, попробуйте выполнить вывод следующего запроса:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' CHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

Надеюсь, это поможет ...

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

Что бы мы сделали, это:

  

сохранить вашу таблицу

<Ол>
  • создать новую таблицу с правильной структурой
  • отключите все ограничения для этих таблиц и те, которые ссылаются на них
  • переместить все данные в новую таблицу с изменением поля; это может быть сделано партиями
  • удалить старую таблицу, когда она пуста
  • переименуйте новую таблицу в старое имя
  • включите все ограничения для всех таблиц (некоторые столбцы FK и ограничения, вероятно, тоже нуждаются в исправлении ... Но они не PK, поэтому они могут быть изменены)

      

    6 отредактировано (спасибо Алексею)

  • Это чисто, выполнимо партиями, хорошо понято.

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

    Это не простой или короткий процесс. Я бы посоветовал вам сообщить своим пользователям, что база данных будет недоступна для обслуживания (вы можете определить, сколько времени займет время, необходимое для выполнения dev) в установленную дату, и сбросить базу данных в однопользовательский режим, пока вы делаете Эти изменения. Вы не хотите терять данные, которые добавляются (или изменяются) пользователями в одну таблицу, когда вы переключаетесь на другую. если по какой-то причине у вас не может быть окна обслуживания (и я настоятельно рекомендую это сделать ради целостности данных), то сначала вы должны изменить дочерние таблицы, чтобы избежать ошибок вставки, если вы действительно близки к пределу и будете видя большие цифры почти сразу.

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

    Обязательно сделайте все это с помощью скриптов на dev. Это облегчит создание одного продукта после того, как вы протестируете процесс.

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top