Вставить новый первичный ключ в таблицу, в которой уже есть данные

#sql-server #azure-sql-server

#sql-сервер #azure-sql-сервер

Вопрос:

У меня есть таблица с миллионом записей, и требуется добавить новое поле int ‘Id’ в качестве первичного ключа с автоматическим добавлением. Теперь мне удается работать с таблицами с разумно небольшим объемом данных, но некоторые таблицы содержат миллионы записей и выдают ошибку тайм-аута. База данных — это Azure SQL

 'MyTable(dbo)' table
- Unable to modify table.  
Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the 
server is not responding.
The statement has been terminated.
 

Комментарии:

1. Как вы выполняете эти команды?

2. Честно говоря, вам может быть лучше создать новую таблицу, вставить существующие данные в новую, а затем DROP отредактировать старую таблицу и переименовать новую. Однако требование добавления IDENTITY столбца в таблицу с миллионами строк уже имеет для меня некоторый «запах» проблемы XY .

3. @David, я перехожу в редактор конструктора, щелкнув правой кнопкой мыши по таблице в SQL Management Studio, затем добавляю новый идентификатор столбца и в разделе свойства —> Спецификация идентификатора —> установить для приращения идентификатора значение Yes

4. @Larnu, внешнего ключа нет. Я работаю над кодом и знаю, что нужно вернуться, но мне нужно быстрое грязное решение.. Это постановка, так что я не возражаю взять Рика сюда

5. Вот почему я рекомендовал вам создать новую версию таблицы, INSERT добавить в нее существующие данные, а затем DROP старую таблицу и переименовать новую, @Toxic . Затем вы также можете использовать a BULK INSERT , если вам это действительно нужно.

Ответ №1:

Я создаю пример кода, на который, возможно, вы сможете сослаться:

 CREATE TABLE dbo.doc_exz (column_a INT not null, column_b INT) ;
GO
INSERT INTO dbo.doc_exz VALUES (7,7) ;
INSERT INTO dbo.doc_exz VALUES (7,7) ;
INSERT INTO dbo.doc_exz VALUES (7,7) ;
INSERT INTO dbo.doc_exz VALUES (7,7) ;
GO

ALTER TABLE dbo.doc_exz ADD id int IDENTITY(1,1) not null 
GO

ALTER TABLE doc_exz ADD PRIMARY KEY (id)
GO        
SELECT * FROM dbo.doc_exz ;
GO

DROP TABLE dbo.doc_exz ;
GO
 

Выходные данные запроса:

введите описание изображения здесь

Если вы все еще получаете ошибку тайм-аута. Вы могли бы последовать предложению @Larnu:

  1. Создайте новую версию таблицы
  2. ВСТАВЬТЕ в нее существующие данные
  3. затем УДАЛИТЕ старую таблицу и переименуйте новую.

Вы можете использовать МАССОВУЮ ВСТАВКУ для данных большого объема.