SQL Server добавляет автоинкрементный первичный ключ к существующей таблице - PullRequest
217 голосов
/ 01 февраля 2011

Как заголовок, у меня есть существующая таблица, которая уже заполнена 150000 записями. Я добавил столбец идентификаторов (который в настоящее время равен нулю).

Я предполагаю, что могу выполнить запрос, чтобы заполнить этот столбец инкрементными числами, а затем установить в качестве первичного ключа и включить автоматическое увеличение. Это правильный путь? И если да, то как мне заполнить начальные цифры?

Ответы [ 13 ]

383 голосов
/ 01 февраля 2011

Нет - вы должны сделать это наоборот: добавьте его прямо с самого начала как INT IDENTITY - он будет заполнен значениями идентичности, когда вы сделаете это:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

и тогда вы можете сделать его первичным ключом:

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

или, если вы предпочитаете делать все за один шаг:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
18 голосов
/ 01 февраля 2011

Вы не можете "включить" IDENTITY: это перестройка таблицы.

Если вас не волнует порядок номеров, вы бы добавили столбец NOT NULL с IDENTITY за один раз. 150 тысяч строк не много.

Если вам нужно сохранить какой-то порядок номеров, добавьте номера соответствующим образом. Затем используйте конструктор таблиц SSMS, чтобы установить свойство IDENTITY. Это позволяет вам создать сценарий, который будет выполнять удаление / добавление / сохранение номеров / повторное заполнение столбца для вас.

11 голосов
/ 20 сентября 2012

У меня была эта проблема, но я не мог использовать столбец идентификаторов (по разным причинам). Я остановился на этом:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

Заимствовано у здесь .

4 голосов
/ 14 июля 2014

Если столбец уже существует в вашей таблице и он имеет значение NULL, вы можете обновить столбец с помощью этой команды (заменить идентификатор, имя таблицы и ключ таблицы):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x
2 голосов
/ 27 октября 2017

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

USE [Db_YourDbName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Drop TABLE [dbo].[Tbl_TourTable]

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](150) NULL)  

GO

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 
2 голосов
/ 31 июля 2017

дизайнером вы можете установить идентификатор (1,1), щелкните правой кнопкой мыши на tbl => desing => в левой части (щелкните правой кнопкой мыши) => properties => в столбцах идентификаторов выберите # column

Свойства

столбец idendtity

2 голосов
/ 06 февраля 2014

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

0 голосов
/ 21 марта 2018

ALTER TABLE table_name ADD COLUMN ID INT NOT NULL ПЕРВИЧНЫЙ КЛЮЧ AUTO_INCREMENT; Это может быть полезно

0 голосов
/ 21 марта 2018

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

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
BEGIN


ALTER TABLE dbo.YourTable
   ADD PKColumnName INT IDENTITY(1,1)

CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

END

GO
0 голосов
/ 26 ноября 2016

Это работает в MariaDB, поэтому я могу только надеяться, что это работает в SQL Server: удалите только что вставленный столбец ID, а затем используйте следующий синтаксис: -

ALTER TABLE table_name ADD id INT PRIMARY KEY AUTO_INCREMENT;

Нет необходимости в другом столе. Это просто вставляет столбец id, делает его основным индексом и заполняет его последовательными значениями. Если SQL Server этого не сделает, мои извинения за то, что я потратил ваше время.

...