В SQL Server (в моем случае, 2005), как я могу добавить свойство идентификации в существующий столбец таблицы с помощью T-SQL?
Что-то вроде:
alter table tblFoo
alter column bar identity(1,1)
В SQL Server (в моем случае, 2005), как я могу добавить свойство идентификации в существующий столбец таблицы с помощью T-SQL?
Что-то вроде:
alter table tblFoo
alter column bar identity(1,1)
Я не верю, что вы можете это сделать. Лучше всего создать новый столбец идентификаторов и скопировать данные с помощью команды вставки идентификатора (если вы действительно хотите сохранить старые значения).
Вот достойная статья, описывающая процесс в деталях: http://www.mssqltips.com/tip.asp?tip=1397
Решение, отправленное Vikash, не работает; он создает ошибку "Неправильный синтаксис" в SQL Management Studio (2005, как указано в OP). Тот факт, что "Компактная версия" SQL Server поддерживает такую операцию, - это просто ярлык, потому что реальный процесс больше похож на то, что сказал Роберт и ДжонФХ - создание дублирующей таблицы, заполнение данных, переименование исходных и новых таблиц соответственно.
Если вы хотите сохранить значения, которые уже существуют в поле, которое должно быть личным, вы можете сделать что-то вроде этого:
CREATE TABLE tname2 (etc.)
INSERT INTO tname2 FROM tname1
DROP TABLE tname1
CREATE TABLE tname1 (with IDENTITY specified)
SET IDENTITY_INSERT tname1 ON
INSERT INTO tname1 FROM tname2
SET IDENTITY_INSERT tname1 OFF
DROP tname2
Конечно, отбрасывание и повторное создание таблицы (tname1), которая используется в реальном времени, НЕ рекомендуется!:)
Заселена ли таблица? Если не отбрасывать и воссоздавать таблицу.
Если заполняется, какие значения уже существуют в столбце? Если они являются значениями, которые вы не хотите сохранять.
Создайте новую таблицу по своему желанию, загрузите записи из старой таблицы в новый тальбе и позвольте базе данных заполнить столбец идентичности как обычно. Переименуйте исходную таблицу и переименуйте ее в нужное имя:).
Наконец, если столбец, который вы хотите сделать идентификатором, в настоящее время содержит значения первичного ключа и ссылается уже на другие таблицы, вам нужно будет полностью подумать, если вы уверены, что это то, что вы хотите сделать:)
Нет прямого способа сделать это, кроме:
A) через SQL i.e.:
-- make sure you have the correct CREATE TABLE script ready with IDENTITY
SELECT * INTO abcTable_copy FROM abcTable
DROP TABLE abcTable
CREATE TABLE abcTable -- this time with the IDENTITY column
SET IDENTITY_INSERT abcTable ON
INSERT INTO abcTable (..specify all columns!) FROM (..specify all columns!) abcTable_copy
SET INDENTITY_INSERT abcTable OFF
DROP TABLE abcTable_copy
-- I would suggest to verify the contents of both tables
-- before dropping the copy table
B) Через MSSMS, который будет делать то же самое в фоновом режиме, но будет меньше жира.
Это приведет к падению и воссозданию таблицы со всеми исходными данными. Если вы получите предупреждение:
Перейдите в MSSMS Инструменты → Параметры → Дизайнеры → Дизайнеры таблиц и баз данных и снимите флажок "Предотвратить сохранение изменений, требующих повторного создания таблицы"
Осторожно:
Создать новую таблицу
SELECT * INTO Table_New FROM Table_Current WHERE 1 = 0;
Удалить столбец из новой таблицы
Alter table Table_New drop column id;
Добавить столбец с идентификатором
Alter table Table_New add id int primary key identity;
Получить все данные в новой таблице
SET IDENTITY_INSERT Table_New ON;
INSERT INTO Table_New (id, Name,CreatedDate,Modified)
SELECT id, Name,CreatedDate,Modified FROM Table_Current;
SET IDENTITY_INSERT Table_New OFF;
Бросить старый стол
drop table Table_Current;
Переименовать новый стол как старый
EXEC sp_rename 'Table_New', 'Table_Current';
alter table tablename
alter column columnname
add Identity(100,1)