Adding columns to a sybase table with unique auto_

2019-08-01 08:45发布

I've inherited a Sybase database that has the 'unique auto_identity index' option enabled on it. As part of an upgrade process I need to add a few extra columns to the tables in this database i.e.

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

When I try to do this I get the follow error:

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

Is it possible to add columns to a table with this property enabled?

Update 1:

I created the following test that replicates the problem:

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

The alter table command here produces the error. (Have tried this on ASE 15/Solaris and 15.5/Windows)

Update 2:

This is a bug in the Sybase dbisql interface, which the client tools Sybase Central and Interactive SQL use to access the database and it only appears to affect tables with the 'unique auto_identity index' option enabled.

To work around the problem use a different SQL client (via JDBC for example) to connect to the database or use isql on the command line.

2条回答
Fickle 薄情
2楼-- · 2019-08-01 09:04

When I ran your sample code I first get the error:

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

This is no doubt because the data within your table needs copying out because the new column is not null. This will use tempdb I think, and the error message you've posted refers to a temp table. Is it possible that this dboption has been accidentally enabled for the tempdb?

It's a bit of a shot in the dark, as I only have 12.5 to test on here, and it works for me. Or it could be a bug.

查看更多
再贱就再见
3楼-- · 2019-08-01 09:12

Should be no problem to ALTER TABLE with such columns; the err msg indicates the problem regards something else. I need to see the CREATE TABLE DDL.

Even if we can't ALTER TABLE, which we will try first, there are several work-arounds.

Responses

Hah! Internal Sybase error. Open a TechSupport case.

Workaround:

  1. Make sure you get jthe the exact DDL. sp_help . Note the IDENTITY columns and indices.
  2. Create a staging table, exactly the same. Use the DDL from (1). Exclude the Indices.
  3. INSERT new_table SELECT old_table. If the table is large, break it into batches of 1000 rows per batch.
  4. Now create the Indices.

If the table is very large, AND time is an issue, then use bcp. You need to research that first, I am happy to answer questions afterwards.

查看更多
登录 后发表回答