Neexistuje žádné implicitní (automatické) přetypování z text
nebo varchar
na integer
(tj. nemůžete předat varchar
na funkci, která očekává integer
nebo přiřadit varchar
pole na integer
jeden), takže musíte zadat explicitní přetypování pomocí ALTER TABLE ... ALTER COLUMN ... TYPE ... USING:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Všimněte si, že v textových polích můžete mít mezery; v takovém případě použijte:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
k odstranění prázdného místa před převodem.
Pokud byl příkaz spuštěn v psql
, mělo to být zřejmé z chybové zprávy , ale je možné, že vám PgAdmin-III neukazuje celou chybu. Zde je to, co se stane, když to otestuji v psql
na 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
Děkujeme @muistooshort za přidání USING
odkaz.
Viz také tato související otázka; jde o migraci Rails, ale základní příčina je stejná a odpověď platí.
Pokud chyba přetrvává, nemusí souviset s hodnotami sloupce, ale indexy nad tímto sloupcem nebo výchozími hodnotami sloupce nemusí přetypovat. Indexy je třeba zrušit před ALTER COLUMN a poté znovu vytvořit. Výchozí hodnoty by měly být odpovídajícím způsobem změněny.