Es gibt keine implizite (automatische) Umwandlung von text
oder varchar
nach integer
(dh Sie können a nicht varchar
an eine Funktion übergeben, integer
die ein varchar
Feld erwartet oder einem Feld zuweist). Daherinteger
müssen Sie eine explizite Umwandlung mit ALTER TABLE ... ALTER COLUMN ... TYPE angeben. .. VERWENDUNG :
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);
Leerzeichen vor dem Konvertieren entfernen.
Dies sollte aus einer Fehlermeldung ersichtlich sein, wenn der Befehl ausgeführt wurde psql
, aber es ist möglich, dass PgAdmin-III Ihnen nicht den vollständigen Fehler anzeigt . Folgendes passiert, wenn ich es in psql
PostgreSQL 9.2 teste:
=> 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
Vielen Dank an @muistooshort für das Hinzufügen des USING
Links.
Siehe auch diese verwandte Frage ; Es geht um Rails-Migrationen, aber die zugrunde liegende Ursache ist dieselbe und die Antwort gilt.
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.