ошибка синтаксиса (примерное положение: "NOT") в PostgreSQL на запрос CREATE DATABASE IF NOT EXISTS "myDB";

ну собственно в заголовке все написано. при выполнении через SQL Shell (psql) запроса CREATE DATABASE IF NOT EXISTS "myDB"; возвращает ошибку "ошибка синтаксиса (примерное положение: "NOT")". из-за чего это может быть? соре если вопрос глупый или уже существует, но ничего подобного я не нашел (возможно плохо искал)

Версия postgresql: 17.5.1 windows x64
Вопрос от 15.06.2025

p.s. ошибка не только при создании бд, но и при создании пользователя и таблиц в схеме public


Ответы (2 шт):

Автор решения: Dmitry

Данная команда не поддерживается при создании баз данных. Следовательно, нужна небольшая обработка, чтобы убедиться, что такой базы данных не существует

SELECT 'CREATE DATABASE "myDB"'
WHERE NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = 'myDB')\gexec
→ Ссылка
Автор решения: Мелкий

Ошибка синтаксиса всегда говорит о том, что синтаксический парсер перестал понимать, что вы хотели сказать написанным. Всегда, и в запросах SQL, и в языках разметки, и в любом программном коде.

Проверьте документацию - проверьте документацию именно к тому языку, который вызывает проблему. И именно к той версии сервера/языка программирования, которую используете вы в данный момент. Работая с postgresql, есть очень мало смысла консультироваться с документацией синтаксиса, например, mysql.

Версия СУБД из вопроса неясна, впрочем, синтаксис CREATE DATABASE с годами почти не меняется. Как можно увидеть в документации (копия документации есть так же у самого psql, вызывается командой \help create database) - никакого if not exists у create database не предусмотрено - потому это очевидная ошибка синтаксиса. (парсер жалуется на not - начиная со второго слова - т.к. create database if это допустимая команда создания базы с именем if)

Идемпотентность этой команды можно обеспечить внешними средствами, запросив предварительно существование базы данных в системном каталоге pg_database и отправлять команду create database только если такой базы ещё нет.

→ Ссылка