2010-02-11 8 views
1

Si je crée une table mytable avec la colonne data comme varchar(2) puis que j'insère quelque chose comme '123' dans la colonne, postgres me donnera une erreur pour Valeur trop longue pour le type.Obtenir Postgres pour tronquer des valeurs si nécessaire?

Comment Postgres peut-il ignorer cela et tronquer la valeur si nécessaire?

Aussi, je ne sais pas (lors de la création de la requête) connaître la taille réelle de la colonne data dans mytable donc je ne peux pas simplement le lancer.

Répondre

6

Selon le postgres documentation, vous devez le convertir explicitement pour obtenir ce comportement, car renvoyer une erreur est une exigence du standard SQL. N'existe-t-il aucun moyen d'inspecter le schéma de la table avant de créer la requête pour savoir à quoi la convertir?

+0

Oui, je suppose qu'il est .. prend juste plus de travail .. suppose que c'est ma seule solution bien que. – Earlz

+0

Exemple serait utile. Cela ne s'applique-t-il pas uniquement aux données de table existantes, au lieu d'être appliqué pendant COPY? La page que vous référencez indique: «Si l'on affecte explicitement une valeur au caractère variant (n) ou au caractère (n), alors une valeur de sur-longueur sera tronquée à n caractères sans déclencher une erreur». Mais j'ai toujours une erreur, par exemple 'valeur trop longue pour type caractère variable (50)' .. – geotheory

0

Vous pouvez modifier le type de données en varchar, puis utiliser un déclencheur pour appliquer les deux contraintes char.

1

type de texte Utiliser avec déclencheur à la place:

create table mytable (
    data text 
); 

create or replace function mytable_data_trunc_trigger() 
    returns trigger language plpgsql volatile as $$ 
begin 
    NEW.data = substring(NEW.data for 2); 
    return NEW; 
end; 
$$; 

create trigger mytable_data_truncate_trigger 
    before insert or update on mytable for each row 
    execute procedure mytable_data_trunc_trigger(); 

insert into mytable values (NULL),('1'),('12'),('123'); 

select * from mytable; 
 
data 
------ 

1 
12 
12 
(4 rows) 
+0

Probablement un peu de surcharge pour les nouvelles applications, mais une excellente solution pour le code existant migrer à partir d'autres DB avec autotruncation vers Postgres. –

1

les plus simples est sousChaîne juste

INSERT INTO mytable (data) VALUES (substring('123' from 1 for 2)); 
Questions connexes