Перейти к основному содержимому

phpPgAdmin — SQL, DDL и DML

Разработчику

В PostgreSQL объекты живут внутри схемы (чаще всего public). phpPgAdmin отражает это в дереве слева: база → схема → таблица. Команды SQL те же, что в psql и на SQL-тренажёре, но синтаксис отличается от MySQL.

Синтаксис SELECT, JOIN и агрегатов — 107, 55, 6. Практикум на схеме магазина — 111.


Где выполнять SQL

МестоКонтекст
Вкладка SQL на сервереЛюбые запросы
SQL внутри базы / схемы / таблицыУже выбран search_path или объект
История (History)Повтор ранее выполненных запросов (в поддерживаемых версиях)

Поддерживаются пакетные запросы (несколько команд через ;). Результаты SELECT — таблица с сортировкой по клику на заголовок столбца (с 3.x).


Базы и схемы (DDL)

Создание базы

Интерфейс: «Создать базу данных» на уровне сервера.

SQL:

CREATE DATABASE shop
ENCODING 'UTF8'
LC_COLLATE 'ru_RU.UTF-8'
LC_CTYPE 'ru_RU.UTF-8'
TEMPLATE template0;

TEMPLATE template0 нужен, если кодировка отличается от шаблона по умолчанию.

Схемы

CREATE SCHEMA app AUTHORIZATION app_owner;
SET search_path TO app, public;

В phpPgAdmin схемы видны под базой; можно изменить владельца схемы, экспортировать схему отдельно (функция зрелых 5.x).

Удаление

DROP DATABASE shop;
DROP SCHEMA app CASCADE;

CASCADE снимает зависимые объекты — используйте осознанно.


Таблицы, индексы, ограничения (DDL)

Создание таблицы

Мастер задаёт столбцы, типы (integer, varchar, text, timestamptz, jsonb…), NOT NULL, PRIMARY KEY, UNIQUE, CHECK, FOREIGN KEY.

SQL:

CREATE TABLE app.users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
meta JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

BIGSERIAL создаёт связанную sequence — в дереве она отображается отдельно.

Изменение структуры

ЗадачаSQL
Добавить столбецALTER TABLE app.users ADD COLUMN name text;
Тип / ограничениеALTER TABLE ... ALTER COLUMN ...
ИндексCREATE INDEX idx_users_email ON app.users (email);
FKALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY ...
Удалить таблицуDROP TABLE app.users CASCADE;

phpPgAdmin поддерживает каскадное удаление столбцов и ограничений (с 3.0-beta).

Представления, функции, триггеры

Создание и правка через соответствующие разделы (с 3.0 — триггеры, функции с volatility, setof). Код отображается в редакторе; для сложной логики удобнее хранить определения в миграциях репозитория.


Данные — DML

Просмотр

Browse — постраничный просмотр; длинные строки можно развернуть; сортировка по столбцу.

Вставка

Форма Insert или:

INSERT INTO app.users (email) VALUES ('user@example.com')
RETURNING id;

RETURNING — идиоматично для PostgreSQL.

Обновление и удаление

UPDATE app.users SET email = 'new@example.com' WHERE id = 1;
DELETE FROM app.users WHERE id = 1;

Редактирование строки в UI требует уникального ключа или OID (в старых версиях PG) — иначе browse/edit ограничен.

Sequences

SELECT nextval('app.users_id_seq');
ALTER SEQUENCE app.users_id_seq RESTART WITH 100;

В интерфейсе — отдельный узел sequence с операциями create/alter.


Роли и права (DCL)

В PostgreSQL роль может быть «пользователем для входа» и/или группой.

CREATE ROLE app_reader LOGIN PASSWORD 'secret';
GRANT CONNECT ON DATABASE shop TO app_reader;
GRANT USAGE ON SCHEMA app TO app_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA app TO app_reader;

phpPgAdmin предоставляет формы Grant/Revoke на базы, схемы, таблицы, функции; с 3.0 — массовый revoke нескольким ролям.

Раздел «Роли» на сервере — аналог «Учётных записей» в phpMyAdmin, но модель ролей PG, не mysql.user.


Сводка DDL / DML / DCL

КатегорияПримерыUI phpPgAdmin
DDLCREATE, ALTER, DROP (DB, SCHEMA, TABLE, INDEX)Мастера + SQL
DMLSELECT, INSERT, UPDATE, DELETEBrowse, Insert, SQL
DCLGRANT, REVOKE, CREATE ROLEPrivileges, Roles

Отличия от phpMyAdmin при тех же задачах

ЗадачаMySQL (phpMyAdmin)PostgreSQL (phpPgAdmin)
АвтоинкрементAUTO_INCREMENTSERIAL / IDENTITY
Строковые типыDATETIMETIMESTAMPTZ
Идентификаторыобратные кавычки `двойные кавычки " для регистра
Движок таблицыInnoDB / MyISAMнет «движков», только access method
ПользователиMySQL User accountsRoles

Связь с PHP (PDO)

$dsn = 'pgsql:host=127.0.0.1;port=5432;dbname=shop';
$pdo = new PDO($dsn, 'app_user', 'secret', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$pdo->exec('SET search_path TO app, public');

См. работа с БД из PHP — драйвер pgsql в DSN.


Следующий шаг

Дампы, роли и FAQ.

EXPLAIN ANALYZE на вкладке SQL — первый шаг к оптимизации 8.11 и главам 881, 884.


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").