2009-06-19 25 views
2

Comment puis-je tronquer un VARCHAR à la longueur du champ de table AUTOMATIQUEMENT dans Derby en utilisant SQL?Tronquer un VARCHAR à une longueur spécifique dans Derby AUTOMATIQUEMENT

Pour être précis:

CREATE TABLE A (B VARCHAR(2)); 
INSERT INTO A B VALUES ('1234'); 

jetterait une SQLException:

A truncation error was encountered trying to shrink VARCHAR '123' to length 2. 

Yat-il un moyen facile de supprimer cette exception?

Répondre

3

Non. Vous devriez l'enlever après avoir vérifié les métadonnées. Ou si vous ne voulez pas vérifier les méta-données à chaque fois, vous devez synchroniser votre code et votre base de données. Mais ce n'est pas un gros problème, c'est une pratique habituelle dans les validateurs.

+0

Cette table est utilisée partout. Garder le code synchronisé n'est pas facile. –

+0

En synchronisation avec la base de données que je veux dire. Ce n'est pas un gros problème, ce ne serait pas tout de temps en temps. Posez-vous une question à quelle fréquence vous modifierez la longueur du champ dans votre base de données. Ces quelques validations vont de pair avec les contraintes des bases de données, je n'y vois aucun problème. –

+0

Et si vous voulez vraiment faire cela, vérifiez les méta-données avant l'insertion, il en résulterait un manque de performance, néanmoins. –

0

Vous pouvez découper le varchar avant de l'insérer. utilisez la fonction trim dans votre script/procédure d'insertion. Je ne suis pas familier avec Derby, mais dans MSSQL je fais exactement la même chose, en utilisant trim pour éviter l'erreur de troncature (seulement là où je n'ai pas besoin des données complètes), il est beaucoup plus préférable d'augmenter la longueur de le varchar

+0

L'augmentation de la varchar est pas souhaitable ici, je crois. Il n'a aucun problème avec la troncature, la troncature est même un comportement préférable pour lui. Deuxièmement, couper seulement travailler pour les espaces. –

0

Vous pouvez utiliser SUBSTR:

CREATE TABLE A (B VARCHAR(2)); 
INSERT INTO A B VALUES (SUBSTR('1234', 1, 2)); 

Si vous utilisez les commandes préparées:

INSERT INTO A B VALUES (SUBSTR(?, 1, 2));