Добавить первичный ключ в таблицу с большим количеством записей - PullRequest
19 голосов
/ 08 февраля 2010

У меня есть таблица в SQL Server 2005, содержащая 10000054 записей; эти записи вставляются с помощью операции массовой вставки. Таблица не содержит первичный ключ, и я хочу иметь его. Если я попытаюсь изменить структуру таблицы, добавив новый столбец PK, установленный как int с isidentity, консоль управления выдаст предупреждение:

"Изменения в таблицах с большими объемами данных могут занять значительное время. Пока изменения сохраняются, данные таблицы будут недоступны."

затем выводит ошибку:

» Невозможно изменить таблицу. Тайм-аут истек. Время ожидания истекло до завершения операции или сервер не отвечает. «

Мне нужен ПК в моем столе.

Как я могу добавить это?

Ответы [ 6 ]

26 голосов
/ 08 февраля 2010

Если в Management Studio вы установили первичный ключ в представлении «Дизайн» (без сохранения), при следующем щелчке правой кнопкой мыши появится параметр «Создать сценарий изменения» - этот параметр также доступен в меню «Конструктор таблиц» в верхней части. .

Это обеспечивает необработанный SQL (безопасно завернутый в транзакцию), который вы можете скопировать в буфер обмена, передать его для запуска в качестве нового запроса (кнопка вверху слева или Файл> Создать> Запрос с текущим соединением), вставить его в выберите нужную БД и выполните запрос.

12 голосов
/ 19 мая 2014

Я знаю, что это старше, но я столкнулся с этим и решил по-другому. Предполагая, что вы используете SSMS 2008, вы можете перейти к Инструменты -> Параметры

В разделе ' Дизайнеры ', затем ' Дизайнеры таблиц и баз данных ' измените '1011 * Время ожидания транзакции после ' значение. По умолчанию 30, 0 для бесконечного. Попробуйте создать первичный ключ после увеличения значения.

Это гораздо быстрее, чем; создание новой базы данных, копирование данных, удаление старой базы данных и переименование новой базы данных в старую базу данных. После того, как вы закончите применять первичный ключ, вы также можете установить тайм-аут на 30 - если хотите, ваш выбор.

Обновление Добавление скриншота enter image description here

8 голосов
/ 08 февраля 2010

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

2 голосов
/ 08 февраля 2010

Попробуйте сгенерировать сценарий SQL и запустить его из окна SQL-запроса.

0 голосов
/ 08 февраля 2010

От вас ответ Дэвиду, что у вас нет подходящего столбца для первичного ключа. В этом случае вы можете добавить int int в качестве последнего столбца таблицы, массовая вставка продолжит работать.

Поскольку таблица загружается с массовой вставкой, лучшим вариантом будет усечение таблицы (таблица усечения MYTBL); измените его, добавив идентификатор (измените таблицу TBL, добавьте идентификатор int первичный ключ идентификации) и повторите выдачу массовой загрузки.

Если вы не можете заполнить таблицу, вы можете использовать штамп или хасан, чтобы изменить таблицу.

0 голосов
/ 08 февраля 2010

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

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