2014-01-06 5 views
3

Sybase 12,5Alter exisitng INT столбец идентичности в Sybase

Я существующая таблица в производстве, что нужно это PK INT столбец может быть изменен таким образом, что она автоматически заполняется - при создании таблицы было бы идеально имели столбец идентификатора, созданный как идентификатор. Этот столбец идентификатора является внешним ключом в нескольких других таблицах, поэтому удаление таблицы и запуск снова не является вариантом. Проблема в том, что я не могу установить PK как идентификатор, а создание столбца temp с текущими значениями и копирование их в новый столбец IDENTITY также не выполняется.

Поскольку столбец идентификатора уже заполнен, я не могу просто превратить этот столбец в IDENTITY (по крайней мере, я не нашел SQL, который сделает это).

Я создал копию таблицы с дополнительным столбцом, содержащим текущее значение PK (split_id_tmp).

CREATE TABLE division_tmp 
(
    division_id int IDENTITY NOT NULL 
    division_id_tmp int,  
    description varchar(255) NOT NULL, 
    is_active tinyint DEFAULT 1 NOT NULL, 
) 

Когда я пытаюсь ввести datascript из исходной таблицы

INSERT INTO division_tmp 
(description,is_active,division_id_tmp,division_id) 
VALUES 
('TEST',1,36,34) 

Я получаю следующее сообщение об ошибке:

Error: Explicit value specified for identity field in table 'division_tmp' 
when 'SET IDENTITY_UPDATE' is OFF. 

Если я запускаю заявление:

SET IDENTITY_INSERT division_tmp OFF 

Заявление выполняется без int, но попытки вставить результат datascript в ту же ошибку, что и выше. Если я запускаю заявление

SET IDENTITY_INSERT ac_division_lookup_awd ON 

Я получаю ошибку

Error: Unable to 'SET IDENTITY_INSERT' for table '**division_tmp**' because 
IDENTITY_INSERT or IDENTITY_UPDATE is already ON for the table '**division**' in 
database 'preserve'. 

Я не могу быть первым человеком, который пережил эту проблему? Любые идеи о том, где я ошибаюсь?

Thanks

+0

Или, если честно, у меня есть столбец A, который является int PK. Мне нужно создать столбец B, сделать его столбцом идентификации и заполнить его значениями A. –

+0

Существует еще один вариант: это всего около 7 пользователей, которые будут вставлять в эту таблицу, вероятность того, что они будут выполнять одновременную Вставка небольшая. Я могу удалить личность, восстановить PK и вставить select max (division_id) + 1. Это грязное исправление, но попытка перегруппировки ключей по всей схеме намного более рискованна. –

ответ

3

Решено. Подумайте, основная проблема - это инструмент.

путаться между:

IDENTITY_INSERT 

и

IDENTITY_UPDATE 

Итак, что мне нужно сделать, это:

alter table division add division_id_tmp int IDENTITY not null 
SET IDENTITY_UPDATE division ON 
update division set division_id_tmp = division_id 
SET IDENTITY_UPDATE division OFF 
alter table division drop division_id 
EXEC sp_rename 
    @objname = 'division.division_id_tmp', 
    @newname = 'division_id', 
    @objtype = 'COLUMN' 

Работа сделано!