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'.
我不能成为第一个遇到这个问题的人吗?关于我哪里出错的任何想法?
由于
答案 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'
完成工作!