У меня есть задача создать миграцию 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-эквивалент мне тоже подойдет.
1) Он должен работать только с ALTER TABLE public.trp_order_sold ALTER COLUMN affext TYPE VARCHAR;
2) Этот ERROR: operator does not exist: varchar >= integer
выглядит так, будто исходит от чего-то другого. Есть ли в миграции другая операция, затрагивающая таблицу?
Чаще всего они будут использовать или зависеть от вашего столбца:
when
В моем тесте (онлайн-демонстрация) только последний приводит к ошибке, которую вы показали:
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 , подобное этому.
Спасибо, это сработало. Проблема действительно заключалась в ограничении.
Этот столбец можно использовать, например, в сгенерированном столбце, ограничении или триггере. Можете ли вы поделиться DDL для этой таблицы? Обновлено: Это может сделать контрольное ограничение. демо