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:
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.