sql >> Databáze >  >> RDS >> PostgreSQL

Změnit typ pole varchar na celé číslo:nelze automaticky přetypovat na typ celé číslo

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.



  1. Jak vrátíte názvy sloupců tabulky?

  2. Přidejte identity AppPool IIS 7 jako přihlášení k serveru SQL

  3. sql skupina podle versus odlišné

  4. Jak přidat nový sloupec do existující tabulky v SQL Server (T-SQL)