Немає неявного (автоматичного) відтворення від textабо varcharдо integer(тобто ви не можете передати varcharфункцію, яка очікує integerабо призначити varcharполе integerодному), тому ви повинні вказати явний виступ за допомогою ALTER TABLE ... ALTER COLUMN ... TYPE. .. ВИКОРИСТАННЯ :
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Зверніть увагу, що у текстових полях може бути пробіл; у такому випадку використовуйте:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
знімати простір перед перетворенням.
Це було очевидно з повідомлення про помилку, якщо команда виконується psql, але можливо PgAdmin-III не показує вам повну помилку. Ось що відбувається, якщо я тестую його psqlна 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
Дякуємо @muistooshort за додавання USINGпосилання.
Дивіться також це пов'язане питання ; мова йде про міграцію Рейлів, але основна причина та сама, і відповідь стосується.
Якщо помилка все-таки виникає, вона може бути пов’язана не зі значеннями стовпців, але індекси над цим стовпцем або значеннями за замовчуванням стовпця можуть не вводити typecast. Індекси потрібно скинути перед ALTER COLUMN і відтворити після. Значення за замовчуванням слід відповідним чином змінити.