MySQL де-факто является стандартом в веб-разработке. Любой спец по PHP является спецом в MySQL.
Мне же в текущем проекте поставили условие: работаем с сервером PostgreSQL. В самом деле, оба этих сервера БД используют язык SQL. Но тонкости все же есть. Так что сейчас мне приходится привыкать к PostgreSQL. Здесь я изложу свои впечатления от PostgreSQL и расскажу о тех тонкостях, которые мне уже попались. Когда наберу ещё материала, опубликую ещё одну статью.
Установка сервера PostgreSQL на локальный компьютер ничем не отличается от установки MySQL. А вот с клиентом типа PHPMyAdmin посложнее. Обычно я использую HeidiSQL, но с PostgreSQL он глючит, поэтому пришлось поставить какой-то условно-бесплатный клиент.
Впечатления от PostgreSQL положительные. Достаточно быстрый сервер. Специально провел несколько тестов на скорость, работает быстрее, чем мускул. Для теста сконвертировал базу движка OpenCart, которая с трудом волокёт несколько тысяч товарных позиций - прирост скорости заметен.
Тонкости. Типы полей.
Первое, что бросается в глаза - нет коротких строковых типов данных. Либо TEXT, либо CHAR. Впрочем, особых проблем при современных огромных SSD на серверах это не создаёт. Разве что для проектов с огромным количеством текстовой информации, может быть и будут сложности, уж не знаю.
Также есть тонкость с первичными ключами. В MySQL первичный ключ имеет тип INTEGER, снабженный атрибутом AUTO_INCREMENT. В PostgreSQL такого атрибута нет, поэтому первичному ключу надо присвоить тип SERIAL, а при добавлении строки вообще не указывать его значение:
INSERT INTO my_table (name, date,...) VALUES ('$name', CURRENT_TIMESTAMP,...
Это вынуждает при добавлении данных перечислять поля после названия таблицы. Мне даже пришлось написать небольшую утилиту, которая генерирует INSERT и UPDATE запросы, чтобы меньше времени уходило на написание запросов.
Есть парочка вкусностей. В текущем проекте мне часто придется работать с IP и Mac-адресами, а в PostgreSQL есть специальные поля для данных такого типа (INET и Mac соответственно).
Тонкости. Написание запросов.
В MySQL в запросе названия баз данных, таблиц и полей хорошо заключать в обратные кавычки. В PostgreSQL это вызовет ошибку запроса. Там если нужны кавычки, надо использовать двойные:
$query = "INSERT INTO \" my_table\"(...";
Для ограничения выборки в MySQL используется конструкция LIMIT:
SELECT * FROM ... LIMIT $start, $number
В PostgreSQL используется конструкция LIMIT ... OFFSET:
SELECT * FROM ... LIMIT $number OFFSET $start
Причем LIMIT и OFFSET могут идти в произвольном порядке. При этом необязательно указывать оба этих параметра.
Тонкости. Функции PHP для работы с PostgreSQL.
Практически все функции, которые есть в PHP для MySQL, имеют свои аналоги для PostgreSQL. Только префикс другой: pg_. Например, функция pg_query. Исключением является функция pg_connect(). Ей надо передавать строку с параметрами соединения и все.
Тонкости. LAST_INSERT_ID.
Для MySQL в PHP есть функция mysql_insert_id(), которая возвращает значение первичного ключа последней добавленной записи. Для PostgreSQL такой функции нет. Как же получить ID последней добавленной записи? Вот небольшой лайфхак:
$query = 'SELECT * FROM "my_table" ORDER BY "ID" DESC LIMIT 1';
$res = pg_query($query) or die('Ошибка запроса');
$row = pg_fetch_array($res);
$last_insert_id = $row["ID"];
Резюме.
Итак, переход с MySQL на PostgreSQL не представляет никаких проблем для достаточно опытного программиста. Впрочем, для обычных задач такой переход не имеет смысла, поскольку виртуальные хостинги не часто имеют в комплекте сервер PostgreSQL. А настраивать сервер на VDS или на физическом сервере - это лишняя возня. Это становится оправданным лишь для крупных проектов с особыми требованиями. С другой стороны, умение работать с ещё одной технологией никогда никому не вредило.
Если вы заметили в тексте ошибки или знаете ещё какие-нибудь тонкости PostgreSQL, пишите об этом в комментариях.
Спасибо, что дочитали мою статью до конца. Если она вам понравилась, поставьте, пожалуйста, лайк. Также я буду рад, если вы подпишетесь на мой канал. Всегда рад прочитать ваши комментарии, ответить на вопросы и учесть ваши пожелания и предложения. До новых встреч!