Der er ingen implicit (automatisk) cast fra text
eller varchar
til integer
(dvs. du kan ikke videregive en varchar
til en funktion, der forventer integer
eller tildel en varchar
felt til et integer
en), så du skal angive en eksplicit cast ved hjælp af ALTER TABLE ... ALTER COLUMN ... TYPE ... USING:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Bemærk, at du muligvis har mellemrum i dine tekstfelter; i så fald skal du bruge:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
at fjerne mellemrum før konvertering.
Dette burde have været tydeligt fra en fejlmeddelelse, hvis kommandoen blev kørt i psql
, men det er muligt, at PgAdmin-III ikke viser dig hele fejlen. Her er hvad der sker, hvis jeg tester 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
Tak @muistooshort for at tilføje USING
link.
Se også dette relaterede spørgsmål; det handler om Rails migrationer, men den underliggende årsag er den samme, og svaret gælder.
Hvis fejlen stadig opstår, er den muligvis ikke relateret til kolonneværdier, men indekser over denne kolonne eller kolonnestandardværdier kan muligvis mislykkes med typecast. Indekser skal slettes før ALTER COLUMN og genskabes efter. Standardværdier bør ændres korrekt.