Es gibt drei Arten von Besetzungen. Die registrierte Umwandlung für Ihren Quell- und Zieltyp muss "Zuweisung" (a
sein ) oder "implizit" (i
) um in den VALUES
zu arbeiten Ausdruck eines INSERT
Aussage. Betrachten Sie den Systemkatalog pg_cast
, die Umwandlung von boolean
zu integer
ist nur "explizit" definiert (e
) :
SELECT castsource::regtype, casttarget::regtype, castfunc::regproc, castcontext
FROM pg_cast
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Ergebnis:
castsource casttarget castfunc castcontext
boolean integer pg_catalog.int4 e
Verwandte:
Sie müssten castcontext
ändern damit es funktioniert - was Sie können als Superuser tun. Für dieses exotische Manöver gibt es keine "ALTER CAST"-Anweisung, Sie müssten UPDATE
direkt. Wie:
UPDATE pg_cast
SET castcontext = 'a'
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Allerdings , gibt es gute Gründe für den vordefinierten Cast-Kontext jedes Casts. Das Manipulieren von Systemkatalogen sollten Sie nicht auf die leichte Schulter nehmen. In diesem speziellen Fall kann es die Entscheidungsfindung aus dem Gleichgewicht bringen, wenn Postgres eine passende Besetzung auswählen muss. Wie zum Auswählen aus einer Menge überladener Funktionen ...
Ähnliches Verfahren für integer -> boolean
, int2 -> boolean
, boolean -> int2
usw.