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