Redshift临时表异常:重复创建报错与查询无结果问题咨询
Redshift临时表异常问题排查
问题1:首次执行CREATE TEMP TABLE报错“表已存在”
Redshift的TEMP临时表是会话级生命周期,但它并不会自动覆盖同名表——如果当前会话中已存在同名临时表,或者当前搜索路径下存在同名的永久表/外部表,就会触发“表已存在”错误,这并非TEMP关键字失效:
- 若你是在同一个会话中重复运行这段脚本,第一次执行后临时表已存在,再次执行就会报错;
- 若你从未在当前会话创建过该表,说明当前数据库的搜索路径里存在同名的永久表/外部表,临时表命名优先级低于永久表,因此冲突报错。
问题2:表存在但查询无数据
这种情况通常和脚本执行流程或表的实际指向有关:
- 如果CREATE TEMP TABLE报错后,你继续执行了INSERT和SELECT语句,此时实际操作的是同名的永久表(而非临时表),若该永久表本身为空,查询自然无数据;
- 若INSERT语句未成功执行(比如CREATE报错导致脚本中断,INSERT未运行),即便临时表后续创建成功,也会因为没有插入数据而返回空结果;
- 另外,Redshift临时表仅在当前会话可见,若你切换会话查询同名表,实际访问的可能是永久表或不存在的表,也会返回空。
修复建议
- 避免命名冲突:要么给临时表加独特前缀(如
tmp_weeks_in_year),要么先检查并清理同名表:
注:DROP TEMP TABLE IF EXISTS weeks_in_year_table; CREATE TEMP TABLE weeks_in_year_table ( week_num INT );DROP TEMP TABLE IF EXISTS仅删除临时表,不会影响永久表;若要同时清理永久表,可使用DROP TABLE IF EXISTS。 - 确保脚本完整执行:在工具中运行脚本时,若CREATE语句报错,后续语句可能不会执行,需排查报错原因后重新完整运行;
- 确认表的类型:执行以下语句查看表类型,确认是否是临时表(
tabletype为TEMPORARY):SELECT tablename, tabletype FROM pg_tables WHERE tablename = 'weeks_in_year_table';
内容的提问来源于stack exchange,提问作者jbuddy_13
相关产品推荐
相关产品推荐

