Как я могу заменить существующий первичный ключ новым первичным ключом на моем столе?


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

Ключ имеет тип NVARCHAR(50) и содержит строку, генерируемую приложением на основе различных элементов таблицы. По понятным причинам я хотел бы заменить этот ключ на автоинкрементный (identity) столбец INT. Это огромная база данных, и мы совершенствуем ее по частям. Мы хотим свести к минимуму изменения в таблицах, в которые записываются другие компоненты. Я решил, что смогу измениться. стол, ничего не нарушая, просто:
  1. добавление нового столбца Id в таблицу и его обнуление
  2. заполняя его уникальными целыми числами и делая его NOT NULL
  3. удаление существующего первичного ключа, гарантируя, что ограничение уникальности все еще существует в этом столбце
  4. Установка нового столбца Id в качестве нового первичного ключа и идентификатора
Пункт 3 оказывается очень болезненным. Поскольку это основная таблица, существует Много других таблицы с ограничениями внешнего ключа на нем. Чтобы удалить существующий первичный ключ, мне кажется, что я должен удалить все эти ограничения внешнего ключа и создать их снова после этого.

Есть ли более простой способ сделать это, или мне просто придется написать сценарий?

2 3

2 ответа:

Боюсь, что это плохая новость. Мы только что закончили большой проект, занимаясь тем же самым, хотя у нашего главного DBA было несколько трюков в рукаве. Вы можете посмотреть на что-то вроде this, чтобы получить ваши сценарии, созданные для переключения переключателя:

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

Таким образом, подход, который я использовал, был
  1. Добавьте новый столбец с автоматически увеличивающимся целым числом в базовую таблицу, убедитесь, что он имеет уникальный индекс (который позже будет заменен первичным ключом)
  2. для каждой связи внешнего ключа, указывающей на базовую таблицу, добавьте новый столбец в детском столе. (обратите внимание, что это может привести к добавлению более одного столбца в дочернюю таблицу, если несколько отношений)
  3. для каждого экземпляра ключа в дочерней таблице введите значение в новое поле (Поля) внешнего ключа
  4. Замените ваши отношения внешнего ключа так, чтобы новый столбец теперь служил
  5. сделайте новый столбец в базовой таблице основным
  6. Поместите старый первичный ключ в базовую таблицу, а каждый старый внешний ключ в базовую таблицу. дети.

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

Update child_table
set new_column = (select new_primary from base)
where old_primary = old_foreign