2017-10-11 5 views
1

Je suis en train de convertir une colonne de varchar à bigint en utilisant la requête suivante:erreur Vertica lors de la modification des types de données

ALTER TABLE 'table_name' ALTER COLUMN 'colname' SET DATA TYPE BIGINT; 

Mais j'obtiens l'erreur suivante:

SQL Error [2377] [0A000]: [Vertica][VJDBC](2377) ROLLBACK: Cannot convert column "colname" from "varchar(128)" to type "int" 
[Vertica][VJDBC](2377) ROLLBACK: Cannot convert column "colname" from "varchar(128)" to type "int" 
com.vertica.util.ServerException: [Vertica][VJDBC](2377) ROLLBACK: Cannot convert column "src_mainuser" from "varchar(128)" to type "int" 

La colonne a Valeurs int comme 37439510 mais en format Varchar.

+0

semble être un problème de données et vous avez un nombre entier non là quelque part. Essayez de sélectionner colname :: bigint à partir de nom_table (à peu près sûr que c'est une syntaxe de conversion de données valide pour vertica) si cette erreur se produit, vous avez un caractère ou deux dans cette colonne. – Twelfth

+0

Est-ce que ... pas d'erreurs ... – anonymous

+0

Peut-être une limitation Vertica ... cette erreur ne donne pas beaucoup pour l'information, pas de mention de types de données en conflit vraiment. Contactez le vendeur, l'équipe de développement de Vertica pourrait avoir une meilleure réponse que ce que je dis ensuite. Standard autour de travail, créer une deuxième table qui a la colonne en tant que grand int, puis masser toutes les lignes de l'ancienne table. Déposez la vieille table, renommez la nouvelle table. Si vous obtenez une meilleure réponse de Vertica, s'il vous plaît partager. – Twelfth

Répondre

1

réponse n'est pas possible, cela ne fonctionnera pas par Vertica deifnition:

https://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/AdministratorsGuide/Tables/ChangingAColumnsDataType.htm

Deux méthodes.

  1. Créer une nouvelle table, charger une nouvelle table, supprimer une ancienne table, renommer une nouvelle.

  2. Créer une colonne dans le tableau. Charge la colonne de l'ancien. Alter table pour enlever l'ancienne colonne

+0

Oui ... ce sont les seuls moyens possibles. Pas de typecasting direct disponible – anonymous

1

Si vous voulez garder votre table, essayez:

ALTER TABLE table_name ADD COLUMN colname_as_int INT DEFAULT colname::INT;

Puis:

ALTER TABLE table_name ALTER COLUMN colname_as_int DROP DEFAULT;

Puis:

ALTER TABLE table_name DROP COLUMN colname;

Et enfin:

ALTER TABLE table_name RENAME COLUMN colname_as_int TO colname;

fonctionne seulement, cependant, si vous avez pas de projections sur table_name avec colname comme ORDER BY colonne ou une colonne segmentées par HASH(); vous devrez remplacer ces projections par une autre superprojection et laisser tomber ces projections en premier ....