2013-10-25 8 views
7

У меня есть таблица на SQL Server с набором записей. Я хочу преобразовать столбец идентификатора, который является Первичным ключом, в колонку идентификации без потери данных. Я думал о следующих двух подходах:Преобразование существующего столбца в идентификатор

  1. Создать новую таблицу с идентификатором & отбросить существующую таблицу.
  2. Создать новый столбец с идентификатором & удалить существующий столбец.

но ясно, что они не могут быть реализованы, потому что сохранение записей - это мой первый приоритет.

Есть ли другой способ сделать это?

+2

возможно дубликат [Добавление идентичности к существующему столбцу] (http://stackoverflow.com/questions/1049210/adding-an-identity-to-an-existing-column) –

+0

дубликат, но я также упомянуть ограничения – Billz

+0

Является ли ваш столбец ID уже подключенным к другим таблицам как внешний ключ? – kinske

ответ

2

Как вы используете SQL Server 2012, другой возможной альтернативой может быть создание объекта последовательности, которая имеет начальное значение самого высокого ID +1 уже в таблице, то создайте ограничение по умолчанию для своего столбца, используя GET NEXT VALUE FOR, и ссылайтесь на свой только что созданный объект последовательности.

+0

У меня была такая же проблема, и я решил это решить. Отлично. –

+1

Dang. Я хотел бы привести пример: http://stackoverflow.com/questions/14413383/sequence-as-default-value-for-a-column –

3

Это решение нарушает вашу точку 2, но нет другого пути, и я думаю, что ваша цель состоит в том, чтобы сохранить старые значения, потому что ничего другого не имеет смысла ...

Вы можете сделать следующее:

  1. позволяет вставлять в столбцы идентичности в таблице:

    set identity_insert YourTable ON 
    
  2. добавить новый столбец ID в таблицу с единицей и вставить значения из ваших старых колонн
  3. очередь тождественность вставки от

    set identity_insert YourTable OFF 
    
  4. удалить старый идентификатор столбца
  5. переименовать новый столбец старое название
  6. сделать его первичного ключа

Единственная проблема может быть, что вы ваш столбец идентификатора уже подключен как внешний ключ к другим таблицам. Тогда у вас возникла проблема с удалением старого столбца ... В этом случае после шага 3 вам нужно сбросить ограничения внешнего ключа в своем столбце идентификатора, а затем выполнить шаги с 4 по 6, а затем воссоздать ограничения внешнего ключа.

+0

Это не сработает. Шаг 2 не позволяет выполнить шаг 3. –

+0

Извините, я исправил его. – kinske

-2
create table t1 (col1 int, col2 varchar(10)) 

insert into t1 values (10, 'olddata') 

--add идентичность цв

alter table t1 add col3 int identity(1,1) 

GO 

--rename или удалить старые колонки

alter table t1 drop column col1 

--rename новый столбец со старым именем Col

exec sp_rename 't1.col3', 'col1', 'column' 

GO 

- -add новый тест, обзорная таблица

insert into t1 values ('newdata') 

выберите * от t1

0

Если у вас есть прямой доступ к базе данных сервера, просто зайдите в дизайн таблицы, выберите столбец PK и измените идентификатор на «Да». Убедитесь, что вы выбрали семя для максимального значения этого столбца. Порог равен 1 по умолчанию. Сохраните дизайн стола, и вам должно быть хорошо идти. enter image description here

Смежные вопросы