Det finns ingen implicit (automatisk) cast från text
eller varchar
till integer
(dvs du kan inte skicka en varchar
till en funktion som förväntar sig integer
eller tilldela en varchar
till ett integer
en), så du måste ange en explicit rollbesättning med ALTER TABLE ... ALTER COLUMN ... TYPE ... USING:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Observera att du kan ha blanksteg i dina textfält; använd i så fall:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
för att ta bort blanktecken innan du konverterar.
Detta borde ha varit uppenbart från ett felmeddelande om kommandot kördes i psql
, men det är möjligt att PgAdmin-III inte visar dig hela felet. Här är vad som händer om jag testar det i psql
på 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
Tack @muistooshort för att du lade till USING
länk.
Se även denna relaterade fråga; det handlar om Rails-migreringar, men den bakomliggande orsaken är densamma och svaret gäller.
Om felet fortfarande uppstår kan det inte vara relaterat till kolumnvärden, men index över denna kolumn eller kolumns standardvärden kan misslyckas med typcast. Index måste släppas före ALTER COLUMN och återskapas efter. Standardvärdena bör ändras på lämpligt sätt.