Er is geen impliciete (automatische) cast van text
of varchar
naar integer
(d.w.z. u kunt geen varchar
doorgeven naar een functie die integer
. verwacht of wijs een varchar
. toe veld naar een integer
one), dus je moet een expliciete cast specificeren met ALTER TABLE ... ALTER COLUMN ... TYPE ... USING:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Houd er rekening mee dat er mogelijk witruimte in uw tekstvelden is; gebruik in dat geval:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
om witruimte te verwijderen alvorens te converteren.
Dit zou duidelijk moeten zijn uit een foutmelding als de opdracht werd uitgevoerd in psql
, maar het is mogelijk dat PgAdmin-III u niet de volledige fout laat zien. Dit gebeurt er als ik het test in psql
op 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
Bedankt @muistooshort voor het toevoegen van de USING
link.
Zie ook deze gerelateerde vraag; het gaat over Rails-migraties, maar de onderliggende oorzaak is hetzelfde en het antwoord is van toepassing.
Als de fout zich nog steeds voordoet, heeft deze mogelijk geen betrekking op kolomwaarden, maar indexen over deze kolom of kolomstandaardwaarden kunnen typecast mislukken. Indexen moeten vóór ALTER COLUMN worden verwijderd en daarna opnieuw worden gemaakt. Standaardwaarden moeten op de juiste manier worden gewijzigd.