PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gibt es eine Möglichkeit, den Datentyp postgresql 9.3 so umzuwandeln, dass er nur eine Seite beeinflussen kann?

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.