Вы не можете изменить существующие столбцы для идентификации.
У вас есть 2 варианта,
Создать новую таблицу с идентификатором и удалить существующую таблицу
Создайте новый столбец с идентификатором и удалите существующий столбец
Подход 1. ( Новая таблица ) Здесь вы можете сохранить существующие значения данных во вновь созданном столбце идентификаторов.
CREATE TABLE dbo.Tmp_Names
(
Id int NOT NULL
IDENTITY(1, 1),
Name varchar(50) NULL
)
ON [PRIMARY]
go
SET IDENTITY_INSERT dbo.Tmp_Names ON
go
IF EXISTS ( SELECT *
FROM dbo.Names )
INSERT INTO dbo.Tmp_Names ( Id, Name )
SELECT Id,
Name
FROM dbo.Names TABLOCKX
go
SET IDENTITY_INSERT dbo.Tmp_Names OFF
go
DROP TABLE dbo.Names
go
Exec sp_rename 'Tmp_Names', 'Names'
Подход 2 ( Новый столбец ) Нельзя сохранить существующие значения данных во вновь созданном столбце идентификаторов. Столбец идентификаторов будет содержать последовательность чисел.
Alter Table Names
Add Id_new Int Identity(1, 1)
Go
Alter Table Names Drop Column ID
Go
Exec sp_rename 'Names.Id_new', 'ID', 'Column'
Для получения дополнительной информации см. Следующий пост на форуме по Microsoft SQL Server:
Как изменить столбец на тождество (1,1)
IDENTITY(1, 1)
деталь со столбцом первичного ключаВ SQL 2005 и выше есть хитрость для решения этой проблемы без изменения страниц данных таблицы. Это важно для больших таблиц, где прикосновение к каждой странице данных может занять минуты или часы. Трюк также работает, даже если столбец идентификаторов является первичным ключом, является частью кластеризованного или некластеризованного индекса или других ошибок, которые могут привести к путанице в более простом решении «добавить / удалить / переименовать столбец».
Вот хитрость: вы можете использовать оператор SQL Server ALTER TABLE ... SWITCH, чтобы изменить схему таблицы без изменения данных, то есть вы можете заменить таблицу идентификатором IDENTITY идентичной схемой таблицы, но без столбца IDENTITY. Тот же трюк работает для добавления IDENTITY в существующий столбец.
Обычно ALTER TABLE ... SWITCH используется для эффективной замены полного раздела в многораздельной таблице новым пустым разделом. Но его также можно использовать и в однораздельных таблицах.
Я использовал этот трюк для преобразования менее чем за 5 секунд столбца таблицы из 2,5 миллиардов строк из IDENTITY в не-IDENTITY (чтобы выполнить многочасовой запрос, план запроса которого лучше работал для не-IDENTITY столбцы), а затем восстановил настройку IDENTITY, снова менее чем за 5 секунд.
Вот пример кода того, как это работает.
Это, очевидно, более сложное решение, чем в других ответах, но если у вас большой стол, это может спасти жизнь. Есть несколько предостережений:
На TechNet есть хорошая статья, подробно описывающая требования выше.
ОБНОВЛЕНИЕ - Эрик Ву был ниже комментарий, который добавляет важную информацию об этом решении. Скопируйте его сюда, чтобы убедиться, что он привлекает больше внимания:
Если таблица активно расширяется новыми строками (то есть у вас не так много простоев между добавлением IDENTITY и добавлением новых строк, тогда вместо того
DBCC CHECKIDENT
, чтобы вручную задавать начальное значение идентификатора в новой схеме таблицы, будет: больше, чем самый большой существующий идентификатор в таблице, напримерIDENTITY (2435457, 1)
. Возможно, вы сможете включитьALTER TABLE...SWITCH
иDBCC CHECKIDENT
транзакцию, и транзакцию (или нет - не проверяли это), но кажется, что установка начального значения вручную будет проще и безопаснее.Очевидно, что если в таблицу не добавляются новые строки (или они добавляются только изредка, например, ежедневный процесс ETL), то это условие гонки не будет выполнено, поэтому
DBCC CHECKIDENT
это нормально.источник
DBCC CHECKIDENT('<newTableName>')
сразу после переключения. См. Msdn.microsoft.com/en-us/library/ms176057.aspx для получения дополнительной информации.Вы не можете изменить столбец на столбец IDENTITY. Что вам нужно сделать, это создать новый столбец, который определяется как IDENTITY с самого начала, затем отбросить старый столбец и переименовать новый в старое имя.
Марк
источник
Вот отличное решение, описанное здесь: SQL SERVER - Добавить или удалить свойство идентификации в столбце
Короче говоря, отредактируйте вручную таблицу в SQL Manager, поменяйте личность, НЕ СОХРАНЯЙТЕ изменения, просто покажите сценарий, который будет создан для изменений, скопируйте его и используйте позже.
Это значительно экономит время, потому что он (скрипт) содержит все внешние ключи, индексы и т. Д., Связанные с таблицей, которую вы изменяете. Пишу это вручную ... не дай бог.
источник
Попробуйте использовать ПОСЛЕДОВАТЕЛЬНОСТЬ вместо ИДЕНТИЧНОСТИ .
В SQL Server 2014 (я не знаю о более низких версиях) вы можете сделать это просто, используя последовательность.
Отсюда: последовательность в качестве значения по умолчанию для столбца
источник
Простое объяснение
Переименуйте существующий столбец, используя sp_RENAME
EXEC sp_RENAME 'Table_Name.Existing_ColumnName', 'New_ColumnName', 'COLUMN'
Пример для переименования:
Существующий столбец UserID переименован в OldUserID
Затем добавьте новый столбец, используя запрос alter для установки в качестве первичного ключа и значения идентификатора.
Пример установки первичного ключа
Имя нового созданного столбца - UserID
затем бросьте переименованную колонку
Пример удаления переименованного столбца
Теперь мы добавляем первичный ключ и идентификатор в существующий столбец таблицы.
источник
Я Java-разработчик, который случайно попал в команду без администратора и не могу получить права администратора. Передо мной была поставлена задача переместить всю схему между двумя базами данных, поэтому без администратора базы данных мне пришлось делать это и делать это с помощью сценариев, поскольку я не мог использовать графический интерфейс пользователя в SQL Server 2008, поскольку у меня не было прав администратора.
Все было перенесено без проблем, однако при запуске хранимой процедуры в новой schema.table я обнаружил, что потерял поле идентификатора в таблице. Я дважды проверил скрипт, который создал таблицу, и он был там, однако, SQL Server не получил его, когда я запустил скрипт. Позже мне сказал администратор БД, что он видел эту проблему раньше.
В любом случае для SQL Server 2008 я предпринял следующие шаги, чтобы решить эту проблему, и они сработали, поэтому я публикую это здесь в надежде, что это кому-нибудь поможет. Это то, что я сделал, поскольку у меня были зависимости FK от другой таблицы, что усложняло это:
Я использовал этот запрос, чтобы убедиться, что идентичность действительно отсутствует, и просмотреть зависимости от таблицы.
1.) Найти статистику по таблице:
2.) Создайте дубликат идентичной новой таблицы, за исключением того, что добавьте поле идентификатора в поле PK, где оно было раньше.
3.) Отключить удостоверение для перемещения данных.
4.) Передача данных.
5.) Убедитесь, что данные есть.
6.) Повторно включите личность.
7.) Это лучший сценарий, который я нашел, чтобы получить все отношения FK, чтобы проверить, какие таблицы исходная таблица ссылается как на зависимости, и я столкнулся со многими, так что это хранитель!
8.) Перед следующим шагом убедитесь, что у вас есть все сценарии PK и FK для всех задействованных таблиц.
9.) Вы можете щелкнуть правой кнопкой мыши по каждому ключу и написать скрипт, используя SQL Server 2008
10.) Удалите FK из таблицы зависимостей, используя этот синтаксис:
11.) Оставьте оригинальный стол:
13.) Следующие шаги основаны на сценариях, которые вы создали в SQL Server 2008 на шаге 9.
- Добавить ПК к новой таблице.
- Добавить FK в новую таблицу.
- Добавить FK обратно в таблицу зависимостей.
14.) Убедитесь, что все правильно и полно. Я использовал графический интерфейс для просмотра таблиц.
15.) Переименуйте новую таблицу в исходное имя таблицы.
Наконец-то все заработало!
источник
Вы не можете сделать это так, вам нужно добавить другой столбец, удалить исходный столбец и переименовать новый столбец или создать новую таблицу, скопировать данные и удалить старую таблицу, а затем переименовать новую таблицу в старую. Таблица
если вы используете SSMS и устанавливаете свойство идентификатора на ON в конструкторе, то вот что SQL Server делает за кулисами. Так что если у вас есть таблица с именем [user], это то, что происходит, если вы делаете UserID и идентификатор
Сказав, что есть способ взломать системную таблицу, чтобы выполнить это, установив побитовое значение, но это не поддерживается, и я бы не стал этого делать
источник
Как я понял в обычных случаях, мы создаем таблицу с первичным ключом, имеющим свойство Identity,
поэтому переименовать или удалить столбец, связанный с ограничением первичного ключа, будет невозможно, поскольку правила ограничения проверяют структуру столбцов. Tto достижения этой цели мы должны обработать несколько шагов следующим образом: Предположим , TableName = 'Employee' и ColumnName = '' EmployeeID 1. Добавить новый столбец 'EmployeeId_new' в "Работника таблицы ALTER TABLE ADD Сотрудника EmployeeId_new INT IDENTITY ( 1,1)
Теперь удалите столбец «EmployeeId» из таблицы «Employee».
ALTER TABLE Employee DROP COLUMN EmployeeId
Это вызовет ошибку, потому что применяются правила ограничения первичного ключа и проверки структуры столбца.
* ### ' Сообщение 5074, уровень 16, состояние 1, строка 1 Объект [PK_dbo.Employee] зависит от столбца [EmployeeId].' ###
Таким образом, мы должны сначала удалить ограничение первичного ключа из таблицы «Сотрудник», затем мы можем удалить столбец
ALTER TABLE Ограничение DROP сотрудника [PK_dbo.Employee]
Теперь мы можем удалить столбец EmployeeId из таблицы Employee, как это делалось на предыдущем шаге, где мы получили ошибку
ALTER TABLE Employee DROP COLUMN EmployeeId
Теперь столбец «EmployeeId» удален из таблицы. Поэтому мы переименуем новый добавленный новый столбец «EmployeeId_new» с «EmployeeId».
Sp_rename «Employee.EmployeeId», «EmployeeId_new», «COLUMN»
Чтобы переставить таблицу в том же виде, в каком она была, нам нужно добавить ограничение первичного ключа для столбца EmployeeId.
ALTER TABLE Сотрудник добавить ограничение [PK_dbo.Employee] первичный ключ (EmployeeId)
8. Теперь таблица 'Employee' с 'EmployeeId' модифицируется для правил идентификации вместе с существующим ограничением первичного ключа.
источник
По замыслу не существует простого способа включить или отключить функцию идентификации для существующего столбца. Единственный чистый способ сделать это - создать новый столбец и сделать его столбцом идентификаторов или создать новую таблицу и перенести ваши данные.
Если мы используем SQL Server Management Studio для избавления от значения идентификатора в столбце «id», создается новая временная таблица, данные перемещаются во временную таблицу, старая таблица удаляется, а новая таблица переименовывается.
Используйте Management Studio, чтобы внести изменения, а затем щелкните правой кнопкой мыши в конструкторе и выберите «Создать сценарий изменения».
Вы увидите, что это то, что SQL-сервер делает в фоновом режиме.
источник
К сожалению, нет ни одного; свойство IDENTITY принадлежит таблице, а не столбцу.
Проще всего сделать это в графическом интерфейсе, но если это не вариант, вы можете пройти долгий путь, скопировав данные, отбросив столбец, повторно добавив его с идентификатором и вернув данные обратно.
Смотрите здесь для подробного описания.
источник
Щелкните правой кнопкой мыши имя таблицы в обозревателе объектов. Вы получите несколько вариантов. Нажмите на «Дизайн». Новая таблица будет открыта для этой таблицы. Вы можете добавить ограничение Identity здесь, в «Свойства столбца».
источник
Чтобы изменить свойства идентификатора для столбца:
Вот и все, и это сработало для меня
источник
Если вы используете Visual Studio 2017+
Это сделает все для вас.
источник
Если исходный постер действительно хотел установить существующий столбец в качестве
PRIMARY KEY
таблицы и фактически не нуждался в том, чтобыIDENTITY
столбец был столбцом (две разные вещи), то это можно сделать с помощью t-SQL с помощью:Обратите внимание на круглые скобки вокруг имени столбца после
PRIMARY KEY
параметра.Хотя этот пост старый, и я делаю предположение о необходимости запрашивающих, я чувствовал, что эта дополнительная информация может быть полезна для пользователей, сталкивающихся с этой веткой, так как я считаю, что разговор может привести к тому, что существующий столбец не может быть установлен как первичный ключ без добавления его в качестве нового столбца, что будет неправильно.
источник
Согласно моему нынешнему состоянию, я следую этому подходу. Я хочу, чтобы идентифицировать первичную таблицу после данных, вставленных через скрипт.
Как я хочу добавить идентичность, так что она всегда начинается с 1 до конца количества записей, которые я хочу.
Это создаст тот же столбец первичного ключа с идентичностью
Я использовал эти ссылки: https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table-after-creating-table/
Добавить первичный ключ в существующую таблицу
источник
Я не верю, что вы можете изменить существующий столбец на столбец идентификаторов, используя tsql. Однако вы можете сделать это через представление конструктора Enterprise Manager.
В качестве альтернативы вы можете создать новую строку в качестве столбца идентификаторов, удалить старый столбец, а затем переименовать новый столбец.
источник
В основном есть четыре логических шага.
Создайте новый столбец Identity. Включите Вставить идентификацию для этого нового столбца.
Вставьте данные из исходного столбца (столбец, который вы хотите преобразовать в Identity) в этот новый столбец.
Отключите вставку идентификатора для нового столбца.
Удалите исходный столбец и переименуйте новый столбец в имя исходного столбца.
Там могут быть некоторые сложности, такие как работа на нескольких серверах и т. Д.
Пожалуйста, обратитесь к следующей статье за шагами (используя ssms & T-sql). Эти шаги предназначены для начинающих с меньшим контролем T-SQL.
http://social.technet.microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx
источник
генерирует скрипт для всех таблиц с первичным ключом = bigint, у которых нет набора идентификаторов; это вернет список сгенерированных скриптов с каждой таблицей;
источник