Немає неявного (автоматичного) відтворення від 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 і відтворити після. Значення за замовчуванням слід відповідним чином змінити.