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操作即可。

相关推荐
瑞克-桑切斯2 小时前
企业生产环境:https部署+nginx高可用(业务不中断)
linux·服务器·数据库
zyseo811 小时前
谷歌SEO 准首页词挖掘脚本:找出排在第 8-20 名的隐藏流量
大数据·数据库·人工智能
xiaogai_gai13 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
数据工匠老o13 小时前
异构数据库DDL同步:260条链路的结构变更自动适配方案
数据库·架构
这个DBA有点耶14 小时前
银行业市占率最高的国产数据库是谁?先搞清楚“市占率”的四种口径
数据库·程序员·架构
用户62799471826215 小时前
南大通用GBase 8a之基于审计日志的冷温热数据分析
数据库
数据库小学妹15 小时前
数据库运维五级成熟度:监控、备份、高可用怎么串起来
运维·数据库·监控
一个天蝎座的程序猿15 小时前
为了给报表提速,我把金仓KES的列存储折腾了个遍:聊聊KES的技术能力
数据库
飞越未来云城的霓虹飞猪15 小时前
AI 数据库地图:从 PostgreSQL 到向量数据库,一次看懂 AI 时代的数据底座
数据库
不像程序员的程序媛15 小时前
导出mysql数据结构
数据库·mysql