Изменить тип данных столбца огромной таблицы PK
-
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 не совместим с предыдущими. Р>