1

我继承了一个启用了“唯一 auto_identity index”选项的 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 index”选项的表。

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

4

2 回答 2

1

使用此类列 ALTER TABLE 应该没问题;错误消息表明问题与其他问题有关。我需要查看 CREATE TABLE DDL。

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

回应

哈!内部 Sybase 错误。打开技术支持案例。

解决方法:

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

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

于 2010-11-11T04:35:25.187 回答
0

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

未为数据库“mydb”启用“选择进入”数据库选项。无法完成带有数据复制的 ALTER TABLE。设置“选择进入”数据库选项并重新运行

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

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

于 2010-11-12T11:50:11.817 回答