PostgreSQL 9.6.4创建索引前检查表与索引存在性的语法错误排查
解决PostgreSQL 9.6.4中创建索引前检查表和索引存在性的语法错误
你的DO块代码存在两处关键语法问题,还有一处逻辑判断的小疏漏,我来帮你逐一修正并解释:
问题根源拆解
- 代码结构不完整:你的DO块缺少了
END IF;来闭合IF条件语句,也没有用END;结束整个BEGIN...END代码块,这直接触发了"Syntax error at the end of input"的报错。 - NULL值判断逻辑错误:在SQL里不能用
!= null来判断值是否非空——因为NULL和任何值比较的结果都是NULL,正确的写法是IS NOT NULL。 - 额外补充:其实
CREATE INDEX IF NOT EXISTS本身已经会自动检查索引是否存在,但你想要先确认表存在的逻辑是合理的,所以我们需要把这部分逻辑补全。
修正后的完整代码
DO $$ BEGIN IF (SELECT to_regclass('public.areacrossing') IS NOT NULL) THEN CREATE INDEX IF NOT EXISTS areac_d_idx ON public.areacrossing USING btree (d_id) TABLESPACE pg_default; END IF; -- 闭合IF条件语句 END; -- 闭合BEGIN代码块 $$;
关键细节说明
to_regclass('public.areacrossing') IS NOT NULL:准确判断public.areacrossing表是否存在——表存在时返回对应的关系名,不存在则返回NULL,用IS NOT NULL能正确识别存在性。- 完整的PL/pgSQL代码块结构:必须用
BEGIN...END包裹业务代码,IF条件必须用END IF;闭合,最后用END;结束整个代码块,结尾的$$;是PL/pgSQL代码块的标准结束标记。 CREATE INDEX IF NOT EXISTS:和前面的表存在性检查形成双重保障——即使表存在但索引已创建,也不会抛出重复创建的错误。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

