SQL Server добавление первичного ключа автоматического приращения к существующей таблице
как название, у меня есть существующая таблица, которая уже заполнена 150000 записей. Я добавил столбец Id (который в настоящее время равен нулю).
Я предполагаю, что могу запустить запрос, чтобы заполнить этот столбец инкрементными числами, а затем установить в качестве первичного ключа и включить автоматическое приращение. Это правильный путь для продолжения? И если да, то как мне заполнить начальные цифры?
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 столбцов выберите столбец
вот идея, которую вы можете попробовать. Исходная таблица-нет столбца идентификаторов 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 этого не сделает, приношу свои извинения за то, что потратил ваше время.