将现有的int列更改为sybase中的标识

时间:2014-01-06 20:30:29

标签: sybase identity identity-column

Sybase 12.5

我在生产中有一个现有的表需要更改PK int列以便自动填充 - 当创建表时,理想情况下将ID列创建为Identity。此ID列是多个其他表中的外键,因此删除表并重新启动不是一个选项。问题是,我无法将PK设置为IDENTITY,并且使用当前值创建临时列并将这些值复制到新的IDENTITY列也会失败。

由于ID列已经填充,我不能简单地将此列转换为IDENTITY(至少,我没有找到任何会执行此操作的SQL)。

我创建了一个表的副本,其中一个附加列保存了当前的PK值(division_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,
)

当我尝试从原始表中输入数据脚本时

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

该语句在没有抱怨的情况下执行,但尝试插入数据脚本会产生与上述相同的错误。如果我运行语句

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'.

我不能成为第一个遇到这个问题的人吗?关于我哪里出错的任何想法?

由于

1 个答案:

答案 0 :(得分:4)

解决了它。认为潜在的问题是我是一个工具。

之间感到困惑:

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'

完成工作!