2010-11-09 24 views
1

我已经继承了启用了'unique auto_identity index'选项的Sybase数据库。作为升级过程的一部分,我需要一些额外的列在这个数据库添加到表即将列添加到具有唯一auto_identity索引选项的sybase表中

alter table mytable add <newcol> float default -1 not null 

当我尝试这样做,我得到了如下错误:

Column names in each table must be unique, column name SYB_IDENTITY_COL in table #syb__altab....... is specifed more than once 

是否有可能在启用此属性的情况下将列添加到表中?

更新1:

我创建了下面的测试复制问题:

use master 
sp_dboption 'esmdb', 'unique auto_identity indexoption',true 

use esmdb 

create table test_unique_ids (test_col char) 

alter table test_unique_ids add new_col float default -1 not null 

alter table命令在这里产生错误。

更新(已在ASE 15/Solaris和15.5/Windows的尝试这样做)2:

这是在Sybase DBISQL界面中的错误,该客户端工具Sybase Central和Interactive SQL使用到访问数据库,并且它只会启用“唯一auto_identity索引”选项而影响表格。

要解决该问题,请使用不同的SQL客户端(例如,通过JDBC)连接到数据库,或在命令行上使用isql

回答

1

对于具有这种列的ALTER TABLE应该没有问题;错误信息表明问题涉及其他事情。我需要看到CREATE TABLE DDL。

即使我们不能ALTER TABLE,我们将首先尝试,但有几种解决方法。

回应

哈!内部Sybase错误。打开TechSupport案例。

解决方法:

  1. 确保你得到J此时确切的DDL。 sp_help。请注意IDENTITY列和索引。
  2. 创建一个临时表,完全一样。使用(1)中的DDL。排除索引。
  3. INSERT new_table SELECT old_table。如果表格很大,则将其分成每批1000行。
  4. 现在创建索引。

如果表是非常大的,而时间是一个问题,然后使用BCP。首先需要进行研究,之后我很乐意回答问题。

+0

我更新了原始的一些示例代码,产生了错误。 – tja 2010-11-11 15:51:32

+0

@tja:回应 – PerformanceDBA 2010-11-12 22:44:51

+0

是一个错误,请参阅更新2。 – tja 2010-11-23 17:18:54

0

当我运行示例代码我第一次得到的错误:

The 'select into' database option is not enabled for database 'mydb'. ALTER TABLE with data copy cannot be done. Set the 'select into' database option and re-run

这是毫无疑问的,因为你的表中的数据复制需求,因为新列不为空。这将使用我认为的tempdb,并且您发布的错误消息引用临时表。是否有可能为tempdb意外启用了此dboption?

这是在黑暗中的一点点,因为我只有12.5在这里测试,它对我有用。或者它可能是一个错误。

相关问题