2010-11-09 84 views
1

J'ai hérité d'une base de données Sybase dans laquelle l'option 'index auto_identity unique' est activée. Dans le cadre d'un processus de mise à niveau, je dois ajouter quelques colonnes supplémentaires aux tables dans cette base de données à savoirAjout de colonnes à une table sybase avec une option d'index auto_identity unique

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

Lorsque je tente de faire, je reçois l'erreur suivante:

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

Est-il possible ajouter des colonnes à une table avec cette propriété activée?

Mise à jour 1:

J'ai créé le test suivant qui reproduit le problème:

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 

La commande alter table produit ici l'erreur. (Ont essayé sur ASE 15/Solaris et 15,5/Windows)

Mise à jour 2:

Ce bogue dans Sybase dbisql interface, que les outils clients Sybase utiliser Central et Interactive SQL accéder à la base de données et il semble affecter uniquement les tables avec l'option 'unique auto_identity index' activée. Pour contourner le problème, utilisez un client SQL différent (via JDBC par exemple) pour vous connecter à la base de données ou utilisez isql sur la ligne de commande.

Répondre

1

Ne devrait pas poser de problème à ALTER TABLE avec de telles colonnes; le msg d'erreur indique le problème concerne quelque chose d'autre. J'ai besoin de voir le DDL CREATE TABLE.

Même si nous ne pouvons pas modifier la table, ce que nous allons essayer en premier, il y a plusieurs solutions.

Réponses

Hah! Erreur Sybase interne. Ouvrez un dossier TechSupport.

Solution:

  1. Assurez-vous que vous obtenez jL'indicateur l'exacte DDL. sp_help. Notez les colonnes et les index IDENTITY.
  2. Créez une table de transfert, exactement la même chose. Utilisez le DDL de (1). Exclure les indices.
  3. INSERT new_table SELECT old_table. Si la table est grande, divisez-la en lots de 1000 lignes par lot.
  4. Créez maintenant les index.

Si la table est très grande, et le temps est un problème, puis utilisez bcp. Vous devez d'abord faire des recherches, je suis heureux de répondre aux questions par la suite.

+0

J'ai mis à jour l'original avec un exemple de code qui génère l'erreur. – tja

+0

@tja: Répondu – PerformanceDBA

+0

Est un bogue, voir mise à jour 2. – tja

0

Quand je courais votre code d'exemple que je reçois d'abord l'erreur:

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

Ceci est sans doute parce que les données contenues dans votre table besoins recopiant parce que la nouvelle colonne est non nulle. Cela utilisera tempdb je pense, et le message d'erreur que vous avez posté fait référence à une table temporaire. Est-il possible que cette dboption ait été accidentellement activée pour le tempdb?

C'est un peu un tir dans l'obscurité, comme je n'ai que 12,5 à tester ici, et ça marche pour moi. Ou ça pourrait être un bug.