Как я могу заменить существующий первичный ключ новым первичным ключом на моем столе?
Я работаю с устаревшей базой данных SQL Server, которая имеет основную таблицу с плохим первичным ключом.
Ключ имеет типNVARCHAR(50)
и содержит строку, генерируемую приложением на основе различных элементов таблицы. По понятным причинам я хотел бы заменить этот ключ на автоинкрементный (identity) столбец INT
.
Это огромная база данных, и мы совершенствуем ее по частям. Мы хотим свести к минимуму изменения в таблицах, в которые записываются другие компоненты. Я решил, что смогу измениться. стол, ничего не нарушая, просто:
- добавление нового столбца Id в таблицу и его обнуление
- заполняя его уникальными целыми числами и делая его
NOT NULL
- удаление существующего первичного ключа, гарантируя, что ограничение уникальности все еще существует в этом столбце
- Установка нового столбца Id в качестве нового первичного ключа и идентификатора
Есть ли более простой способ сделать это, или мне просто придется написать сценарий?
2 ответа:
Боюсь, что это плохая новость. Мы только что закончили большой проект, занимаясь тем же самым, хотя у нашего главного DBA было несколько трюков в рукаве. Вы можете посмотреть на что-то вроде this, чтобы получить ваши сценарии, созданные для переключения переключателя:
Однажды я сделал то же самое и в основном использовал процесс, который вы описываете. Кроме того, конечно, вы должны сначала посетить таблицу друг друга и добавить новый внешний ключ, указывающий на новый столбец в вашей базовой таблице
Таким образом, подход, который я использовал, был
- Добавьте новый столбец с автоматически увеличивающимся целым числом в базовую таблицу, убедитесь, что он имеет уникальный индекс (который позже будет заменен первичным ключом)
- для каждой связи внешнего ключа, указывающей на базовую таблицу, добавьте новый столбец в детском столе. (обратите внимание, что это может привести к добавлению более одного столбца в дочернюю таблицу, если несколько отношений)
- для каждого экземпляра ключа в дочерней таблице введите значение в новое поле (Поля) внешнего ключа
- Замените ваши отношения внешнего ключа так, чтобы новый столбец теперь служил
- сделайте новый столбец в базовой таблице основным
- Поместите старый первичный ключ в базовую таблицу, а каждый старый внешний ключ в базовую таблицу. дети.
Это так выполнимо и не так сложно, как может показаться на первый взгляд. Суть заключается в серии инструкций обновления для таблицы children природы
Update child_table set new_column = (select new_primary from base) where old_primary = old_foreign