postgresql - 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 TABLE
和ALTER TABLE
行CREATE INDEX
也在结构之外工作。
错误信息是:
SQL Error [42601]: ERROR: syntax error at or near "IF"
Position: 5
解决方案
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)
推荐阅读
- prometheus - 用普罗米修斯计算最大值
- node.js - NodeJS 中的图片上传
- ruby - jekyll 构建错误未知编码名称“chunked\r\n\r\n25”
- macos - 如何删除一直自行打开的mac应用
- python - 如何将系列合并为 DataFrame 多索引的一列的成员
- bnf - EBNF 到 BNF 转换为表达式的 <<'while'>> ::= while <'Z'> do begin <'A'> { <'A'> } end
- angular - 如何使用带有参数的流来构造 Angular Service 方法以选择一个实体?
- python - Python:如何读取每行都是字符串的 CSV 文件?
- java - 使用 Spring + Thymeleaf 从表中的选定复选框中获取 Id
- vb6 - 获得编译错误:VB6 中未定义子或函数错误