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

相关推荐
敲上瘾10 分钟前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
bksczm1 小时前
Redis 持久化:RDB 快照与 AOF 日志
数据库·redis·mybatis
.痞老板.1 小时前
mysql初阶--数据库设计
数据库·mysql·oracle
Decay__3 小时前
SQL Server 数据库全栈运维实战系列 — 合集索引(24 篇)
运维·数据库·sql·mysql·架构
Thanks_ks3 小时前
SQL 的 GROUP BY 与聚合函数:从会写 SELECT 到会做统计
数据库·sql·mysql·group by·数据统计·聚合函数·having
Decay__11 小时前
12_MySQL InnoDB 内存与锁调优 —— Buffer Pool、redo log、隔离级别与锁等待
运维·数据库·sql·mysql·架构
笃行35012 小时前
AI数据库的库内四层结构,KingbaseES 产品拆解
数据库
我是大猴子13 小时前
redis
数据库·redis·缓存
苏宸啊16 小时前
MySQL(一)
数据库·mysql
2603_9696948516 小时前
JDBC 基础学习笔记:API 核心原理解析与 CRUD 代码实操
数据库·笔记·mysql·学习方法·database·sql注入