sql >> Database teknologi >  >> RDS >> PostgreSQL

Skift type varchar-felt til heltal:kan ikke castes automatisk til typen heltal

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.



  1. Hvordan sletter man dubletter på en MySQL-tabel?

  2. Tricks til kontinuerlig forbedring af databaseovervågning

  3. MySql ser ydeevne

  4. Sådan læser du versionsnummer fra en databasefil i Android, som er placeret i aktiv mappe