SQL Server добавление первичного ключа автоматического приращения к существующей таблице


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

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

13 197

13 ответов:

нет - вы должны сделать это наоборот: добавьте его прямо с самого начала, как 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

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

Если вы не заботитесь о порядке чисел, вы бы добавили столбец, а не NULL, с идентификатором за один раз. 150k строк-это не так много.

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

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

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

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

Если столбец уже существует в вашей таблице и он равен null, вы можете обновить столбец с помощью этой команды (заменить id, tablename и tablekey ):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x

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

с помощью конструктора вы можете установить идентификатор (1,1) правой кнопкой мыши на ТБЛ => дизайн => в часть левой (правой кнопкой мыши) => Свойства => в Identity столбцов выберите столбец

свойства

столбец idendtity

вот идея, которую вы можете попробовать. Исходная таблица-нет столбца идентификаторов table1 создайте новую таблицу-вызовите table2 вместе со столбцом идентификаторов. скопируйте данные из таблицы 1 в таблицу 2-столбец идентификаторов автоматически заполняется автоматически увеличенными числами.

переименовать исходную таблицу-table1 в table3 переименовать новую таблицу-table2 в table1 (исходная таблица) Теперь у вас есть таблица 1 с включенным столбцом идентификаторов и заполненным для существующих данных. убедившись, что есть это не проблема и работает правильно, отбросьте table3, когда больше не нужно.

создайте новую таблицу с другим именем и теми же столбцами, Ассоциацией первичного ключа и внешнего ключа и свяжите ее в инструкции Insert кода. Например: для сотрудника замените на сотрудников.

CREATE TABLE EMPLOYEES(

    EmpId        INT NOT NULL IDENTITY(1,1), 
    F_Name       VARCHAR(20) ,
    L_Name       VARCHAR(20) ,
    DOB          DATE ,
    DOJ          DATE ,
    PRIMARY KEY (EmpId),
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
) 

тем не менее, вы должны либо удалить существующую таблицу сотрудников или сделать некоторые корректировки в соответствии с вашим требованием.

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

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 

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

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

инструкции ALTER TABLE имя_таблицы добавить идентификатор столбца типа int не равен null первичный ключ типа AUTO_INCREMENT ; Это может быть полезно

попробуйте что-то вроде этого (на тестовой таблице):

USE your_database_name
GO
WHILE (SELECT COUNT(*) FROM your_table WHERE your_id_field IS NULL) > 0
BEGIN
    SET ROWCOUNT 1
    UPDATE your_table SET your_id_field = MAX(your_id_field)+1
END
PRINT 'ALL DONE'

Я не проверял это на всех, так что будьте осторожны!

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

ALTER TABLE table_name ADD id INT PRIMARY KEY AUTO_INCREMENT;

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