【发布时间】: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