首页 > 解决方案 > PostgreSQL“如果不存在”总是抛出语法错误

问题描述

我正在尝试运行这个:

IF NOT EXISTS (
   SELECT FROM information_schema.tables
   WHERE table_schema = 'topgun' AND table_name = 'session'
) 

THEN

CREATE TABLE topgun.session (
  sid varchar NOT NULL COLLATE "default",
  sess json NOT NULL,
  expire timestamp(6) NOT NULL
) WITH (OIDS=FALSE);
ALTER TABLE topgun.session ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE;
CREATE INDEX "IDX_session_expire" ON topgun.session ("expire");     

END IF;

如果表不存在,我在这里想要实现的是创建一个表、一个约束和一个索引。

即使更改空行,我也会遇到各种语法错误。IF NOT EXISTS总是会导致错误,无论我做什么或之后发生什么。好像 PostgreSQL 甚至都不知道。即使我从教程中复制片段,PostgreSQL 也会吓坏。

我正在使用 Heroku Postgres,版本 12.4。

SELECT部分本身有效。,CREATE TABLEALTER TABLECREATE INDEX也在结构之外工作。

错误信息是:

SQL Error [42601]: ERROR: syntax error at or near "IF"
  Position: 5

标签: postgresql

解决方案


DO用语句试试

do $$
begin
IF NOT EXISTS (
   SELECT FROM information_schema.tables
   WHERE table_schema = 'public' AND table_name = 'session'
) 

THEN

CREATE TABLE public.session (
  sid varchar NOT NULL COLLATE "default",
  sess json NOT NULL,
  expire timestamp(6) NOT NULL
) WITH (OIDS=FALSE);
ALTER TABLE public.session ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE;
CREATE INDEX "IDX_session_expire" ON public.session ("expire");     

END IF;
end;
$$

演示

最好使用这种方法:

create table if not exists test(Id int)

推荐阅读