Изменить тип данных столбца огромной таблицы PK - PullRequest
2 голосов
/ 14 сентября 2009

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

Ответы [ 4 ]

4 голосов
/ 14 сентября 2009

В дополнение к предложению 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'

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

3 голосов
/ 14 сентября 2009

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

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

  1. создать новую таблицу с правильной структурой
  2. отключить все ограничения для этих таблиц и те, которые ссылаются на них
  3. переместить все данные в новую таблицу с изменением поля; это можно сделать партиями
  4. удалить старую таблицу, когда она пуста
  5. переименовать новую таблицу в старое имя
  6. включить все ограничения для всех таблиц (некоторые столбцы FK и ограничения, вероятно, тоже нуждаются в исправлении ... Но они не PK, поэтому их можно изменять)

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

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

0 голосов
/ 14 сентября 2009

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

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

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

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

0 голосов
/ 14 сентября 2009

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

...