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 этого не сделает, приношу свои извинения за то, что потратил ваше время.