1

'uniqueauto_identityindex'オプションが有効になっている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

ここでaltertableコマンドを実行すると、エラーが発生します。(ASE 15/Solarisおよび15.5/Windowsでこれを試しました)

アップデート2:

これはSybasedbisqlインターフェイスのバグであり、SybaseCentralおよびInteractiveSQLがデータベースにアクセスするために使用するクライアントツールであり、「uniqueauto_identityindex」オプションが有効になっているテーブルにのみ影響するようです。

この問題を回避するには、別のSQLクライアント(たとえば、JDBC経由)を使用してデータベースに接続するか、コマンドラインでisqlを使用します。

4

2 に答える 2

1

そのような列で ALTER TABLE を実行しても問題ありません。err msg は、問題が他の何かに関するものであることを示しています。CREATE TABLE DDL を確認する必要があります。

最初に試す ALTER TABLE ができない場合でも、いくつかの回避策があります。

反応

ハッ!内部 Sybase エラー。TechSupport ケースを開きます。

回避策:

  1. 正確な DDL を取得していることを確認してください。sp_help . IDENTITY 列とインデックスに注意してください。
  2. まったく同じように、ステージング テーブルを作成します。(1) の DDL を使用します。インデックスを除外します。
  3. INSERT new_table 古いテーブルを選択します。テーブルが大きい場合は、バッチごとに 1000 行のバッチに分割します。
  4. 次に、インデックスを作成します。

テーブルが非常に大きく、かつ時間が問題になる場合は、bcp を使用します。最初にそれを調査する必要があります。後で質問にお答えします。

于 2010-11-11T04:35:25.187 に答える
0

サンプル コードを実行すると、最初にエラーが発生します。

データベース 'mydb' では、'select into' データベース オプションが有効になっていません。データのコピーを伴う ALTER TABLE は実行できません。「select into」データベース オプションを設定し、再実行します。

新しい列が null ではないため、テーブル内のデータをコピーする必要があるため、これは間違いありません。これはtempdbを使用すると思いますが、投稿したエラーメッセージは一時テーブルを参照しています。この dboption が誤って tempdb に対して有効になっている可能性はありますか?

ここでテストするのは12.5しかないので、暗闇の中でのショットのようなものですが、それは私にとってはうまくいきます. または、バグである可能性があります。

于 2010-11-12T11:50:11.817 に答える