Как создать базу данных postrgresql с помощью SQL DDL на pgadmin4?

Я изучаю DDL для создания и определения базы данных SQL с помощью Postgresql 10. У меня есть что-то вроде следующего кода SQL в файле .sql, и я хочу ввести его в psql или PgAdmin 4, просто чтобы проверить синтаксис и увидеть структура базы данных:

CREATE DATABASE database;

CREATE TYPE t_name AS 
(      first    VARCHAR(30),
       last     VARCHAR(60) 
);

CREATE TABLE telephone_m 
(   tnumber  VARCHAR(15) NOT NULL UNIQUE
);

CREATE TABLE people 
(   curp        CHAR(18)    NOT NULL PRIMARY KEY,
    pname       t_name      NOT NULL,
    birth_date  DATE        NOT NULL,
    telephone_m VARCHAR(15) REFERENCES telephone_m
);

CREATE TABLE clients
(   curp        CHAR(18)    NOT NULL PRIMARY KEY,
    cid         SERIAL      NOT NULL REFERENCES cards,  
    clocation   VARCHAR(29)
)   INHERITS (people);

CREATE TABLE cards
(   cid         BIGSERIAL   NOT NULL PRIMARY KEY,
    curp        CHAR(18)    NOT NULL REFERENCES clients,
    trips       SMALLINT,
    distance    NUMERIC, 
    points      NUMERIC
);

CREATE TABLE drivers
(   curp        CHAR(18)    NOT NULL PRIMARY KEY,
    rfc         CHAR(22)    NOT NULL UNIQUE,
    adress      t_adress    NOT NULL
)   INHERITS (people);

Я пробовал в PgAdmin 4 щелкнуть правой кнопкой мыши новую базу данных -> CREATE Script, он открывает редактор запросов, я копирую свой код и выполняю его, но он возвращает:

ERROR:  CREATE DATABASE cannot be executed from a function or multi-command string
SQL state: 25001

Я также пытался использовать Query Tool непосредственно из меню инструментов PgAdmin с теми же результатами.


person Diego    schedule 06.09.2019    source источник
comment
Эрвин правильно понял в своем ответе, но я также хотел бы указать, что вы создаете базу данных (база данных с плохим названием), но все таблицы, которые вы создаете, не находятся в этой базе данных. После создания вам нужно будет к нему подключиться.   -  person Jeremy    schedule 06.09.2019


Ответы (2)


База создается нормально. Но если вы хотите создать объект в новой БД, вам нужно подключиться к ней. В любом клиенте, включая pgAdmin4.

И вы не можете запустить CREATE DATABASE внутри транзакции. Должен быть совершен самостоятельно. Выполнение нескольких команд одновременно автоматически включается в одну транзакцию в pgAdmin.

Вы должны выполнить CREATE DATABASE mydb; самостоятельно (например, выбрав только эту строку и нажав F5 при подключении к любой БД, даже к обслуживающей БД "postgres". Затем нажмите в "Базы данных" в обозревателе объектов в главном окне/вкладке pgadmin4 нажмите F5, чтобы обновить представление, щелкните новую базу данных, откройте новый инструмент запросов с помощью значок вспышки (в новом окне / вкладке) и выполните там остальную часть вашего скрипта.

Сценарии psql управляются с помощью метакоманды \c для подключения к новую базу данных после ее создания в том же сеансе.

В стороне:

"база данных" не является хорошим названием для базы данных.

CREATE TYPE AS (...), а просто CREATE TABLE (...). Нет AS.

И обычно вы не хотите использовать тип данных CHAR(18). Видеть:

person Erwin Brandstetter    schedule 06.09.2019
comment
Спасибо, удалил AS и ошибки больше не было. Я прочитал ваш другой ответ, действительно ли полезно не ограничивать количество символов в любом заданном типе String или char? - person Diego; 06.09.2019
comment
@Diego: Если вам действительно нужен лимит, используйте ограничение varchar(n) или CHECK. Никогда не используйте char(n), который в основном устарел. Я добавил еще пару ссылок на основы. - person Erwin Brandstetter; 06.09.2019
comment
Я уже читаю ваши другие вопросы только сейчас, спасибо! Чего я до сих пор не понимаю, так это Но если вы хотите создать объект в новой БД, вам нужно подключиться к ней. Как мне подключить таблицы к БД? - person Diego; 06.09.2019
comment
Вы не соединяете таблицы, вы подключаете свою сессию. Затем запустите CREATE TABLE ... Я добавил пошаговые инструкции выше. - person Erwin Brandstetter; 06.09.2019
comment
Случай «VARCHAR (#)» и «ТЕКСТ» эквивалентен «ЧИСЛОВОМУ» для числовых типов? - person Diego; 06.09.2019
comment
@Diego: Не уверен, что понимаю вопрос в твоем последнем комментарии. Может быть, задать другой вопрос (вместо комментария здесь)? - person Erwin Brandstetter; 09.09.2019

После CREATE DATABASE database отсутствует ; (и, возможно, дать БД лучшее имя).

person Islingre    schedule 06.09.2019