sql >> Databasteknik >  >> RDS >> PostgreSQL

Ändra typ av varchar-fält till heltal:kan inte castas automatiskt till typ heltal

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.



  1. Kontrollera om ett objekt är en primärnyckel med OBJECTPROPERTY() i SQL Server

  2. Känn till relationer mellan alla tabeller i databasen i SQL Server

  3. SQL-uppdatering med row_number()

  4. Hur man installerar SQLite på macOS