2009-05-11 6 views
1

У меня есть быстрый вопрос для вас, гуру SQL. У меня есть существующие таблицы без столбца первичного ключа, а Identity не задано. Теперь я пытаюсь изменить эти таблицы, создав существующий целочисленный столбец в качестве первичного ключа и добавив значения идентификатора для этого столбца. Мой вопрос: должен ли я сначала скопировать все записи из таблицы в временную таблицу перед внесением этих изменений. Освободить все предыдущие записи, если я запустил commnad T-SQL, чтобы сделать первичный ключ и добавить столбец идентификаторов в этих таблицах. Какие подходы следует принять такие какСоздание первичного ключа и столбца идентификации после загрузки данных

1) Создать временную таблицу, чтобы скопировать все записи из таблицы необходимо изменить 2) Загрузить все записи в TempTable 3) Внести изменения на схеме таблицы 4) Наконец, загрузите записи из таблицы temp в исходную таблицу.

или

Есть ли лучшие способы это? Я очень ценю вашу помощь

Благодарности

ответ

3

Надеюсь, у вас не так много записей в таблице. Что произойдет, если вы используете Management Studio для изменения существующего поля для идентификации, так это то, что он создает другую таблицу с установленным полем идентификатора. он включает в себя идентификатор и вставляет записи из исходной таблицы, а затем отключает идентификатор. Затем он удаляет старый стол и переименовывает только что созданную таблицу. Это может быть довольно продолжительный процесс, если у вас много записей. Если это так, я бы скриптировал это, а затем делал это в задании, которое выполняется в нерабочее время, потому что таблица будет полностью заблокирована, пока вы это сделаете.

+0

Спасибо, мне очень понравился ваш ответ. – Shiva

0

Если существующее целое столбец является уникальным и подходящим, не должно быть никаких проблем, превращая его в ПК.

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

Независимо от того, как вы это делаете, обязательно сделайте резервную копию!

2

просто выполните все ваши изменения в студии управления, скопируйте/вставьте сгенерированный скрипт в файл. НЕ СОХРАНЯЙТЕ ИЗМЕНЕНИЯ на данный момент. Посмотрите и отредактируйте этот скрипт по мере необходимости, он, вероятно, сделает почти то, что вы думаете (он потеряет исходную таблицу и переименует временный номер имени оригинала), но также обработает все ограничения и FK.

+0

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

4

Инструменты> Параметры> Конструкторы> Таблица и баз данных Проектировщики

Снимите флажок «Запретить сохранение изменений, которые требуют таблицы воссоздании»

[Edit] Я попытался это с населенными таблицами, и я не сделал потерять данные, но об этом я мало что знаю.

+0

Спасибо за подсказку ...это сэкономило мне время на запрос :) –

0

Вы всегда можете добавить столбец IDENTITY после того, как вы закончили копирование своих данных. Вы также можете сбросить семестр IDENTITY до максимального числа + 1. Это должно решить ваши проблемы.

DBCC CHECKIDENT ('MyTable', переустановку, п)

Где п номер, который вы хотите идентичность начать с.