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

Ändern Sie den Typ des Varchar-Felds in Integer:kann nicht automatisch in den Typ Integer umgewandelt werden

Es gibt keine implizite (automatische) Umwandlung von text oder varchar zu integer (d. h. Sie können kein varchar übergeben zu einer Funktion, die integer erwartet oder weisen Sie einen varchar zu Feld in eine integer one), also müssen Sie eine explizite Umwandlung mit ALTER TABLE ... ALTER COLUMN ... TYPE ... USING:

angeben
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);

Beachten Sie, dass Ihre Textfelder möglicherweise Leerzeichen enthalten. Verwenden Sie in diesem Fall:

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);

zum Entfernen von Leerraum vor dem Konvertieren.

Dies hätte aus einer Fehlermeldung ersichtlich sein müssen, wenn der Befehl in psql ausgeführt wurde , aber es ist möglich, dass PgAdmin-III Ihnen nicht den vollständigen Fehler anzeigt. Folgendes passiert, wenn ich es in psql teste auf PostgreSQL 9.2:

=> CREATE TABLE test( x varchar );
CREATE TABLE
=> insert into test(x) values ('14'), (' 42  ');
INSERT 0 2
=> ALTER TABLE test ALTER COLUMN x TYPE integer;
ERROR:  column "x" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion. 
=> ALTER TABLE test ALTER COLUMN x TYPE integer USING (trim(x)::integer);
ALTER TABLE        

Danke @muistooshort für das Hinzufügen des USING verlinken.

Siehe auch diese verwandte Frage; es geht um Rails-Migrationen, aber die zugrunde liegende Ursache ist die gleiche und die Antwort trifft zu.

Wenn der Fehler weiterhin auftritt, hängt er möglicherweise nicht mit Spaltenwerten zusammen, aber Indizes über diese Spalte oder Spaltenstandardwerte schlagen möglicherweise fehl. Indizes müssen vor ALTER COLUMN gelöscht und danach neu erstellt werden. Standardwerte sollten entsprechend geändert werden.