PostgreSQL自定义类型属性数据类型修改问题求助
问题描述
我在PostgreSQL数据库中创建了名为money_with_currency的自定义复合类型,创建语句如下:
CREATE TYPE public.money_with_currency AS (currency_code char(3), amount numeric);
尝试修改其中currency_code的类型从char(3)改为varchar,执行语句:
ALTER TYPE public.money_with_currency ALTER ATTRIBUTE currency_code SET DATA TYPE varchar;
但收到错误提示:
ALTER TYPE public.money_with_currency ALTER ATTRIBUTE currency_code SET DATA TYPE varchar;
** (Postgrex.Error) ERROR 0A000 (feature_not_supported) cannot alter type "money_with_currency" because column "prog_fees.amount" uses it
请问是否存在无需手动迁移所有使用该类型的列的解决方案?
解决方案
可以在ALTER TYPE语句末尾添加CASCADE选项,让PostgreSQL自动递归更新所有依赖该自定义类型的对象(包括使用该类型的表列),无需手动逐个修改:
ALTER TYPE public.money_with_currency ALTER ATTRIBUTE currency_code SET DATA TYPE varchar CASCADE;
说明
CASCADE会自动处理所有依赖该类型的对象,包括表中的列、函数、约束等,确保类型修改后所有依赖对象都能适配新的类型定义。- 从
char(3)转换到varchar是安全的类型变更,不会导致数据丢失,因为varchar完全兼容char(3)的所有取值。
内容的提问来源于stack exchange,提问作者Tam
相关产品推荐
相关产品推荐

