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

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

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

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, с идентификатором за один раз. 150к строк не много.

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


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

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

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


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

свойства

столбец idendtity


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

переименовать исходную таблицу-table1 в table3 переименуйте новую таблицу-table2 в table1 (исходная таблица) Теперь у вас есть table1 с включенным столбцом идентификатора и заполненным для существующих данных. убедившись в том, что есть нет проблем и работает должным образом, отбросьте 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)   
) 

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


Если ваша таблица имеет отношения с другими таблицами, используя свой первичный или 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 table_name добавить столбец ID 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 добавить id int первичный ключ AUTO_INCREMENT;

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