使用唯一的auto_identity索引选项将列添加到sybase表

时间:2010-11-09 11:33:30

标签: sybase-ase alter-table

我继承了一个Sybase数据库,该数据库启用了“unique auto_identity index”选项。作为升级过程的一部分,我需要在此数据库的表中添加一些额外的列,即

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用来访问数据库,它只会影响启用了“unique auto_identity index”选项的表

要解决此问题,请使用其他SQL客户端(例如,通过JDBC)连接到数据库或在命令行中使用 isql

2 个答案:

答案 0 :(得分:1)

对于具有此类列的ALTER TABLE应该没有问题;错误消息表明问题与其他问题有关。我需要看到CREATE TABLE DDL。

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

<强>响应

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

解决方法:

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

  5. 如果表非常大,并且时间是个问题,那么使用bcp。你需要先研究一下,我很乐意随后回答问题。

答案 1 :(得分:0)

当我运行示例代码时,我首先得到错误:

  

数据库'mydb'未启用'select into'数据库选项。无法完成具有数据复制的ALTER TABLE。设置'select into'数据库选项并重新运行

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

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