使用SQL基于临时表创建视图出现relation already exists错误求助
报错原因
你之前已经创建了名为percent_pop_vax的普通表,PostgreSQL中表、视图属于同一类命名空间,不允许存在同名的关系对象,因此创建视图时触发了重名报错。
解决方案
根据你的使用场景可以选择以下任意一种方式解决:
方式1:删除重名表后创建视图
如果你前面创建的percent_pop_vax表只是临时计算用,不需要长期保留,执行创建视图语句前先删除该表即可。另外建议使用CREATE OR REPLACE VIEW语法,后续修改视图定义时无需手动删除旧视图:
-- 先删除重名的普通表 DROP TABLE IF EXISTS percent_pop_vax; -- 创建视图,OR REPLACE 支持后续直接更新视图定义 CREATE OR REPLACE VIEW percent_pop_vax AS SELECT dea.continent, dea.location, dea.date, dea.population, vax.new_vaccinations, SUM(vax.new_vaccinations) OVER(PARTITION BY dea.Location ORDER BY dea.location, dea.Date) AS rolling_vaccinations FROM public.Covid_deaths dea JOIN public.Covid_vax vax ON dea.location = vax.location AND dea.date = vax.date WHERE dea.continent IS NOT NULL; -- 直接查询视图即可得到计算结果,不需要额外建表 SELECT *, (rolling_vaccinations/population)*100 AS rolling_vax_for_populations FROM percent_pop_vax;
方式2:给视图设置不同名称
如果你需要保留之前创建的percent_pop_vax表,只要给视图起一个不重名的名字即可,比如加_view后缀区分:
CREATE VIEW percent_pop_vax_view AS SELECT dea.continent, dea.location, dea.date, dea.population, vax.new_vaccinations, SUM(vax.new_vaccinations) OVER(PARTITION BY dea.Location ORDER BY dea.location, dea.Date) AS rolling_vaccinations FROM public.Covid_deaths dea JOIN public.Covid_vax vax ON dea.location = vax.location AND dea.date = vax.date WHERE dea.continent IS NOT NULL;
额外注意事项
如果你打算使用**临时表(TEMP TABLE)**创建视图,需要注意:普通视图是永久存储的元数据对象,不能依赖会话级的临时表(临时表会在会话结束后自动删除)。如果确实需要存储临时表的计算结果供后续使用,要么直接把计算逻辑写在视图定义中(就是上面给出的方案),要么按需使用物化视图存储计算结果。
内容的提问来源于stack exchange,提问作者Nuwan Fernando
相关产品推荐
相关产品推荐

