PostgreSQL报SELECT rule‘s target entry X has different type from column “XXX“

执行SQL

sql 复制代码
ALTER TABLE "db_name"."table_name" ADD COLUMN "column_name" VARCHAR (50);
COMMENT ON COLUMN "db_name"."table_name"."column_name" IS '测试';

报错:

shell 复制代码
SELECT rule's target entry X has different type from column "XXX"

例如:SELECT rule's target entry 20 has different type from column "doctorname"

就是包含doctorname别名的视图有问题

解决方案:

sql 复制代码
-- 查找所有依赖 doctorname 列的视图
SELECT 
    n.nspname AS schema_name,
    c.relname AS view_name,
    pg_get_viewdef(c.oid) AS view_definition
FROM 
    pg_class c
JOIN 
    pg_namespace n ON n.oid = c.relnamespace
WHERE 
    c.relkind = 'v'  -- 只查视图
    AND pg_get_viewdef(c.oid) LIKE '%doctorname%'
    AND c.relname NOT LIKE 'pg_%';  -- 排除系统视图

如果上面的没查到视图,再用下面这个查,如果上面查到了,下面就不用了。

sql 复制代码
-- 查找所有依赖 doctorname 列的规则(包括 ON SELECT 规则)
SELECT 
    n.nspname AS schema_name,
    c.relname AS table_name,
    r.rulename AS rule_name,
    pg_get_ruledef(r.oid) AS rule_definition
FROM 
    pg_rewrite r
JOIN 
    pg_class c ON c.oid = r.ev_class
JOIN 
    pg_namespace n ON n.oid = c.relnamespace
WHERE 
    pg_get_ruledef(r.oid) LIKE '%doctorname%'
    AND r.rulename != '_RETURN';  -- 排除视图的隐含规则(如果你已在视图中查到,可以不用查这个)

例如:我这里查到了这3个视图包含doctorname,则把这三个视图备份,删除,重新创建。然后再执行ALTER TABLE操作即可。

相关推荐
洋不写bug3 小时前
二叉树(四)经典算法题目解析,公共祖先,二叉树构造,非递归遍历
数据库·算法·二叉树·二叉树构造·公共祖先
凯子坚持 c3 小时前
如何在教育平台中嵌入在线文档编辑组件:ONLYOFFICE Docs从部署到功能全验证
数据库·onlyoffice
SelectDB3 小时前
Apache Doris 选型实操:4 个维度 Checklist 与验证要点
大数据·数据库·掘金技术征文
SelectDB3 小时前
Apache Doris 高并发点查与实时写入笔记:一套引擎统一实时数仓与在线服务
大数据·数据库·数据分析
李白客3 小时前
时序数据库入门:什么是 TSDB?时序库与关系型数据库对比、主流产品选型指南(2026)
数据库·oracle·时序数据库
SelectDB3 小时前
Apache Doris 存算分离实操:从对象存储接入到多计算集群配置(附 SQL)
大数据·数据库·数据分析
SelectDB3 小时前
Apache Doris 多表 Join 优化实战:从 CBO 到 Colocate Join 配置(附 SQL)
大数据·数据库·数据分析
tachibana23 小时前
什么是 Function Calling ?
数据库·人工智能·ai·llm·agent
全栈弄潮儿²⁰²⁴3 小时前
AI Agent 开发实战(7):如何接入搜索和数据库工具?
数据库·人工智能·ai·chatgpt·oracle·agent·ai编程