Как я могу заменить существующий первичный ключ новым первичным ключом в моей таблице? - PullRequest
3 голосов
/ 02 августа 2011

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

Ключ имеет тип NVARCHAR(50) и содержит сгенерированную приложением строку, основанную на различных вещах встол.По понятным причинам я хотел бы заменить этот ключ на автоинкрементный (идентификатор) столбец INT.

Это огромная база данных, и мы обновляем ее по частям.Мы хотим минимизировать изменения в таблицах, в которые пишут другие компоненты.Я подумал, что могу изменить таблицу, ничего не нарушая, просто:

  1. Добавление нового столбца Id в таблицу и сделать его обнуляемым
  2. Заполнение уникальными целыми числами и создание NOT NULL
  3. Удаление существующего первичного ключа при сохранении ограничения уникальности для этого столбца
  4. Установка нового столбца Id в качестве нового первичного ключа и идентификатора

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

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

Ответы [ 2 ]

1 голос
/ 02 августа 2011

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

Таким образом, я использовал следующий подход:

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

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

Update child_table
set new_column = (select new_primary from base)
where old_primary = old_foreign
1 голос
/ 02 августа 2011

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

...