Es gibt keine implizite (automatisch), gegossen aus text
oder varchar
-integer
(dh Sie können keine varchar
auf eine Funktion erwartet integer
oder zuordnen varchar
Feld zu einer integer
ein Pass), so dass Sie eine explizite Umwandlung mit ALTER TABLE ... ALTER COLUMN ... TYPE ... USING angeben müssen :
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Beachten Sie, dass Sie möglicherweise Leerzeichen in Ihren Textfeldern haben; In diesem Fall verwenden Sie:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
, um Leerzeichen vor der Konvertierung zu entfernen.
Dies sollte durch eine Fehlermeldung offensichtlich sein, wenn der Befehl in psql
ausgeführt wurde, aber es ist möglich, PgAdmin-III zeigt Ihnen nicht den vollständigen Fehler. Hier ist, was passiert, wenn ich es in psql
auf PostgreSQL 9.2 testen:
=> 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
Dank @muistooshort zum Hinzufügen des USING
Link.
Siehe auch this related question; Es geht um Rails-Migrationen, aber die zugrunde liegende Ursache ist dieselbe und die Antwort trifft zu.
Welche spezifische ALTER TABLE haben Sie versucht und was war die spezifische Fehlermeldung? –
@muistooshort Ich versuchte mit alter von phppgadmin. Markieren Sie die Spalte und versuchen Sie, den neuen Feldtyp einzugeben. Der Fehler ist: 'SQL-Fehler: Fehler: Spalte" MID "kann nicht umgewandelt werden, um Integer einzugeben" – itsols
Zuerst ist Backup-Tabelle. Dann können Sie eine andere Spalte (zB field2) vom Integer-Typ in derselben Tabelle erstellen. Wählen Sie in Feld2 den Wert für den Cast in Integer des Felds1 aus. Benenne dann die Spalte um. – Igor