创建含表列类型的PostgreSQL复合类型时遇语法错误求助
问题原因与解决方法
PostgreSQL在CREATE TYPE语句中不支持使用%TYPE引用表列的类型,这个语法仅适用于PL/pgSQL的变量声明,而非DDL层面的复合类型定义,这就是你遇到语法错误的原因。
解决方法
方法1:直接使用列的实际数据类型
先查询目标列的具体类型:
SELECT data_type FROM information_schema.columns WHERE table_schema = 'gp_core' AND table_name = 'transaction_' AND column_name = 'CODE_TRANSACTION';
将查询得到的类型替换到CREATE TYPE语句中,例如如果结果是character varying(32),则写:
CREATE TYPE gp_core.rec_key_transaction AS ( CODE_TRANSACTION character varying(32) );
方法2:用PL/pgSQL动态创建
通过匿名块动态获取列类型并创建复合类型,适合需要自动适配列类型的场景:
DO $$ DECLARE col_type regtype; BEGIN -- 获取列的类型 SELECT pg_typeof(t.CODE_TRANSACTION) INTO col_type FROM gp_core.transaction_ t LIMIT 1; -- 动态执行创建类型的语句 EXECUTE format('CREATE TYPE gp_core.rec_key_transaction AS (CODE_TRANSACTION %s);', col_type); END $$;
注意:如果后续
transaction_.CODE_TRANSACTION的类型发生变更,复合类型不会自动同步,需要手动更新或重新创建。
内容的提问来源于stack exchange,提问作者Rym
相关产品推荐
相关产品推荐

