Добавление столбцов в таблицу sybase с уникальной опцией индекса auto_identity - PullRequest
1 голос
/ 09 ноября 2010

Я унаследовал базу данных Sybase, в которой включена опция «уникальный индекс auto_identity». В рамках процесса обновления мне нужно добавить несколько дополнительных столбцов в таблицы в этой базе данных, т.е.

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 в командной строке.

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Должно быть никаких проблем с ALTER TABLE с такими столбцами;сообщение об ошибке указывает, что проблема связана с чем-то другим.Мне нужно увидеть CREATE TABLE DDL.

Даже если мы не сможем изменить ALTER TABLE, что мы попробуем в первую очередь, есть несколько обходных путей.

Ответы

Ха!Внутренняя ошибка Sybase.Откройте кейс технической поддержки.

Обходной путь:

  1. Убедитесь, что вы получите точный DDL.sp_help.Обратите внимание на столбцы и индексы IDENTITY.
  2. Создайте промежуточную таблицу, точно такую ​​же.Используйте DDL из (1).Исключить индексы.
  3. INSERT new_table SELECT old_table.Если таблица большая, разбейте ее на партии по 1000 строк в пакете.
  4. Теперь создайте индексы.

Если таблица очень большая, И время равновыдайте, затем используйте bcp.Вы должны исследовать это сначала, я с удовольствием отвечу на вопросы потом.

0 голосов
/ 12 ноября 2010

Когда я запускаю ваш пример кода, я сначала получаю сообщение об ошибке:

Опция «выбрать в» не включена для базы данных «mydb»ALTER TABLE с копированием данных не может быть сделано.Установите опцию «выбрать в» и снова запустите

Это, без сомнения, потому что данные в вашей таблице нужно скопировать, потому что новый столбец не нулевой.Это будет использовать tempdb, я думаю, и сообщение об ошибке, которое вы разместили, ссылается на временную таблицу.Возможно ли, что эта dboption была случайно включена для базы данных tempdb?

Это что-то вроде удара в темноте, поскольку у меня есть только 12,5 для тестирования, и это работает для меня.Или это может быть ошибка.

...