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

相关推荐
wefg110 分钟前
【Redis】初识 Redis
数据库·redis·缓存
hacker_LeeFei2 小时前
Windows 下配置 Redis 8.10.2 开机自启:一次踩坑全记录
数据库·windows·redis
这个DBA有点耶3 小时前
MySQL字符集与排序规则深入:索引失效的隐蔽场景与排查方法
数据库·mysql·代码规范
zl_dfq3 小时前
Redis 之 【持久化 与 事务】
数据库·redis
闲云自留地4 小时前
从下载到登录:MySQL 在两大系统上的完整安装教程
数据库·mysql
SelectDB技术团队4 小时前
Apache Doris 高性能 Open Lake Variant 读写技术解析(含对比数据)
数据结构·数据库·clickhouse·日志·apache doris·selectdb·湖仓架构升级
一 乐4 小时前
博客管理系统|基于springboot + vue博客管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕设
如果'\'真能转义说5 小时前
Docker Desktop | 本地化挂载 Postgresql
docker·postgresql·容器
茉莉玫瑰花茶5 小时前
GO [ 类型 ]
开发语言·数据库·golang
ClouGence5 小时前
开源数据库管理工具 CloudDM 4.3.0 发布,支持 SQL 收藏,多数据源语法支持大幅增强
数据库·oracle·sql server