PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Existe-t-il un moyen de convertir le type de données postgresql 9.3 afin qu'il ne puisse affecter qu'un seul côté

Il existe trois types de casting. Le casting enregistré pour votre source et votre type de cible doit être "assignation" (a ) ou "implicite" (i ) pour travailler dans les VALUES expression d'un INSERT déclaration. En regardant le catalogue système pg_cast , le cast de boolean en integer est uniquement défini "explicit" (e ) :

SELECT castsource::regtype, casttarget::regtype, castfunc::regproc, castcontext
FROM   pg_cast
WHERE  castsource = 'bool'::regtype
AND    casttarget = 'int'::regtype;

Résultat :

castsource  casttarget  castfunc         castcontext
boolean     integer     pg_catalog.int4  e

Connexe :

Vous auriez à changer castcontext pour le faire fonctionner - ce que vous pouvez faire en tant que superutilisateur. Il n'y a pas d'instruction "ALTER CAST" pour cette manœuvre exotique, vous devriez UPDATE directement. Comme :

UPDATE pg_cast
SET    castcontext = 'a'
WHERE  castsource = 'bool'::regtype
AND    casttarget = 'int'::regtype;

Cependant , il y a de bonnes raisons pour le contexte de cast prédéfini de chaque cast. La falsification des catalogues système n'est pas quelque chose que vous devez faire à la légère. Dans ce cas particulier, cela peut déséquilibrer la prise de décision lorsque Postgres doit choisir un casting correspondant. Comme pour piocher dans un ensemble de fonctions surchargées...

Procédure similaire pour integer -> boolean , int2 -> boolean , boolean -> int2 , etc.