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

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

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

Ответ 1

Нет - вам нужно сделать это наоборот: добавьте его прямо из get go как 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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Если столбец уже существует в вашей таблице, и он равен нулю, вы можете обновить столбец с помощью этой команды (заменить 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

Ответ 6

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

Свойства

столбец idendtity

Ответ 7

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

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

Ответ 8

Создайте новую таблицу с разными именами и одинаковыми колонками, ассоциацией первичного ключа и внешнего ключа и свяжите это в своем заявлении о вводе кода. Например, для EMPLOYEE замените EMPLOYEES.

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, либо выполнить некоторую настройку в соответствии с вашими требованиями.

Ответ 9

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

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 

Ответ 10

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

ALTER TABLE имя_таблицы ADD id INT PRIMARY KEY AUTO_INCREMENT;

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

Ответ 11

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

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'

Я не тестировал это вообще, поэтому будьте осторожны!