У меня есть столбец с типом Varchar в моей базе данных Postgres, которая я означал быть целыми числами..., и теперь я хочу изменить их, к сожалению, это, кажется, не работает с помощью моей миграции направляющих.
change_column :table1, :columnB, :integer
Который, кажется, производит этот SQL:
ALTER TABLE table1 ALTER COLUMN columnB TYPE integer
Таким образом, я пытался делать это:
execute 'ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER)'
но бросок не работает в этом экземпляре, потому что часть столбца является пустой...
какие-либо идеи?
Ошибка:
PGError: ERROR: invalid input syntax for integer: ""
: ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER)
Пост-ГРЭС v8.3
Похоже, проблема в том, что в вашей таблице есть пустые строки. Вам нужно будет обработать их, возможно, с помощью оператора case, например:
execute% {ALTER TABLE "table1" ALTER COLUMN columnB TYPE integer USING CAST (CASE columnB WHEN '' THEN NULL ELSE columnB END AS INTEGER)}
Обновление: полностью переписано на основе обновленного вопроса.
NULL здесь не должно быть проблемой. Сообщите нам свою версию postgresql и сообщение об ошибке.Кроме того, зачем вы цитируете идентификаторы? Имейте в виду, что идентификаторы без кавычек преобразуются в нижний регистр (поведение по умолчанию), поэтому в вашем запросе может быть проблема с вашим "columnB" - он отображается первым в кавычках, без кавычек в приведении.
Обновление: перед преобразованием столбца в целое число необходимо убедиться, что все ваши значения конвертируемы. В этом случае это означает, что columnB должен содержать только цифры (или ноль). Вы можете проверить это, например,
select columnB from table where not columnB ~ E'^[0-9]+$';
. Если вы хотите, чтобы ваши пустые строки были преобразованы в NULL целые числа, то сначала запустите
UPDATE table set columnB = NULL WHERE columnB = '';