ОШИБКА: оператор не существует: varchar >= integer при изменении типа столбца int на varchar в PostgreSQL

У меня есть задача создать миграцию Liquibase для изменения значения affext в таблице trp_order_sold, которая сейчас имеет значение int8, на varchar (или любой другой текстовый тип, если это более вероятно).

Сценарий, который я сделал, следующий:

ALTER TABLE public.trp_order_sold
    ALTER COLUMN affext SET DATA TYPE VARCHAR
    USING affext::varchar;

Я ожидал, что часть USING affext::text; будет работать как конвертер, однако с ним или без него я получаю эту ошибку:

ERROR: operator does not exist: varchar >= integer
Hint: No operator matches the given name and argument types. You might need to add explicit type casts.

Любые намеки на то, что я делаю неправильно? Также я пишу сценарий PostgreSQL, но рабочий XML-эквивалент мне тоже подойдет.

Этот столбец можно использовать, например, в сгенерированном столбце, ограничении или триггере. Можете ли вы поделиться DDL для этой таблицы? Обновлено: Это может сделать контрольное ограничение. демо

Zegarek 07.02.2023 17:27

1) Он должен работать только с ALTER TABLE public.trp_order_sold ALTER COLUMN affext TYPE VARCHAR; 2) Этот ERROR: operator does not exist: varchar >= integer выглядит так, будто исходит от чего-то другого. Есть ли в миграции другая операция, затрагивающая таблицу?

Adrian Klaver 07.02.2023 17:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чаще всего они будут использовать или зависеть от вашего столбца:

В моем тесте (онлайн-демонстрация) только последний приводит к ошибке, которую вы показали:

create table test_table(col1 int);
--CREATE TABLE
alter table test_table add constraint test_constraint check (col1 >= 1);
--ALTER TABLE
alter table test_table alter column col1 type text using col1::text;
--ERROR:  operator does not exist: text >= integer
--HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

Вам нужно будет проверить ограничения для вашей таблицы с помощью команды \d+ в psql или запросив системные таблицы:

SELECT con.*
FROM pg_catalog.pg_constraint con
    INNER JOIN pg_catalog.pg_class rel
               ON rel.oid = con.conrelid
    INNER JOIN pg_catalog.pg_namespace nsp
               ON nsp.oid = connamespace
WHERE nsp.nspname = 'your_table_schema'
     AND rel.relname = 'your_table_name';

Затем вам нужно будет удалить ограничение, вызывающее проблему, и создать новое ограничение для работы с вашим новым типом данных.


Поскольку целое число 20 предшествует целому числу 100, а текст «20» идет после текста «100», если вы планируете сохранить старое поведение упорядочения, вам понадобится этот тип приведения:

case when affext<0 then '-' else '0' end||lpad(ltrim(affext::text,'-'),10,'0')

а затем убедитесь, что новые входящие значения affext соответствующим образом преобразуются в триггеры вставки и обновления. Или используйте числовое сопоставление ICU , подобное этому.

Спасибо, это сработало. Проблема действительно заключалась в ограничении.

Jan Přibyl 08.02.2023 10:33

Другие вопросы по теме