【问题标题】:Alter exisitng int column to identity in sybase将现有的 int 列更改为 sybase 中的标识
【发布时间】:2014-01-24 08:56:28
【问题描述】:

Sybase 12.5

我有一个生产中的现有表,需要更改它的 PK int 列以便自动填充 - 当创建表时,理想情况下它会将 ID 列创建为标识。此 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'.

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

谢谢

【问题讨论】:

  • 或者,更清楚地说 - 我有 A 列,它是一个 int PK。我需要创建 B 列,使其成为标识列并用 A 的值填充它。
  • 还有另外一个选项——只有大约 7 个用户会插入到这个表中,他们同时插入的机会很小。我可以删除身份,恢复 PK 并在插入时选择 max(division_id) + 1。这是一个肮脏的修复,但尝试在整个架构中重新组织键风险更大。

标签: sybase identity identity-column


【解决方案1】:

解决了。认为根本问题是我是一个工具。

混淆:

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'

任务完成!

【讨论】:

    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    相关资源
    最近更新 更多