• Почему в crosstab нужно указывать VALUES в запросе на выборку?

    Melkij
    @Melkij
    PostgreSQL DBA
    https://www.postgresql.org/docs/current/tablefunc....
    The main limitation of the single-parameter form of crosstab is that it treats all values in a group alike, inserting each value into the first available column. If you want the value columns to correspond to specific categories of data, and some groups might not have data for some of the categories, that doesn't work well. The two-parameter form of crosstab handles this case by providing an explicit list of the categories corresponding to the output columns.

    crosstab(text, text) вариант не требует именно values. Второй аргумент функции может быть любым запросом, который сгенерирует полный список категорий. Этот вариант crosstab нужен, если первый запрос может возвращать данные не для всех категорий.

    С точки зрения синтаксиса, insert .. values - это то же самое, что insert .. select, а values - это частный случай select только списка констант
    melkij=> VALUES ('кофты'), ('ботинки'), ('пальто');
    column1
    ---------
    кофты
    ботинки
    пальто
    (3 строки)

    это самодостаточный запрос. Можно записать как select 'кофты' union all select 'ботинки' union all select 'пальто', но зачем?
    Ответ написан
    1 комментарий
  • Как сделать запись в mysql с проверкой на уникальность с учётом времени из поля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Легко решается триггером. Пример:

    - исходная таблица:
    CREATE TABLE users (
      id INT AUTO_INCREMENT PRIMARY KEY,
      username VARCHAR(100),
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP
    );


    - триггер:

    CREATE TRIGGER tr_users_bi
    BEFORE INSERT ON users
    FOR EACH ROW
    BEGIN
      DECLARE allowed_created_at DATETIME;
      DECLARE error_message_text VARCHAR(64);
      SELECT MAX(created_at) + INTERVAL 12 HOUR INTO allowed_created_at
      FROM users
      WHERE username = NEW.username;
      IF NEW.created_at < allowed_created_at THEN
        SET error_message_text = CONCAT('Регистрация возможна не ранее ', allowed_created_at);
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = error_message_text; 
      END IF;
    END


    DEMO fiddle

    PS. Надеюсь, получение сгенерированного сообщения об ошибке и показ его юзеру не составит проблемы..
    Ответ написан
    Комментировать
  • Как гарантировать последовательную запись данных без пропусков id?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Таблицы на основе генераторов или sequences обычно ствавят главной задачей - обеспечить
    уникальность id в первую очередь
    . С эти sequence справляется.

    Гарантировать блокировку или захват sequence они не могут так как Postgres создавался
    как много-пользовательская БД
    . Тоесть много сессий обладают правом в любой момент
    взять из sequence следующее значение
    . Поэтому требование хронологии - это как эксклюзивный
    лок объекта. Слишком жесткое требование. И никому не нужное. Если б так БД работали то
    они теряли бы в производительности и ждали-бы чтоб какая-то главная сессия отпустила таблицу.

    Выход есть - брать ранг записи извне. Тоесть само приложение должно быть поставщиком
    таких номеров. А БД будет просто их вставлять.

    Еще вариант - в уже после загрузки обновить одно полей одной транзакцией как row_number
    сортируя по любому признаку.
    Ответ написан
    6 комментариев
  • Какой проект можно сделать на PL/pgSQL новичку?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Холиварный вопросик-то...

    ИМХО

    PL/pgSQL, T-SQL и прочие аналогичные языки в первую очередь предназначены для создания систем, в которых интенсивно используется server-side логика. Ибо возможности и инструментарий такого языка кроет (установленные стандартом) возможности SQL как бык овцу...

    А всё остальное - это винтики-бантики.

    Если кто-то набросает какой-нибудь PL/pgSQL код в любом фиддле, для иллюстрации что на нем можно делать - буду премного благодарен.

    Открываешь документацию по Постгрессу, забиваешь в поиск LANGUAGE plpgsql и получаешь кучу ссылок с примерами кодов. А если это будет документация по ПостгрессПро - так ещё и по-русски.
    Ответ написан
    3 комментария
  • Какой проект можно сделать на PL/pgSQL новичку?

    vabka
    @vabka
    Токсичный шарпист
    Есть две категории случаев, где следует использовать хранимые процедуры:

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

    2. У тебя несколько клиентов и тебе нужно гарантировать целостность. Тогда ты всякие валидации из обычного кода переносишь на СУБД.

    В обоих случаях клиент=серверное приложение, ибо толстые клиенты сейчас делать моветон.
    Ответ написан
    5 комментариев
  • Какие есть песочницы (fiddle) для NoSQL баз данных?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Redis - https://try.redis.io/
    MongoDB - https://www.humongous.io/app/playground/mongodb/new
    ClickHouse - https://play.clickhouse.com/play?user=play
    Neo4j - https://console.neo4j.org/
    ElasticSearch - https://www.elastic.co/demos

    Дополнительно - устанавливаешь докер, качаешь нужный образ, находишь сиды различных БД и играешься
    Ответ написан
    Комментировать
  • Должен ли тип данных внешнего ключа совпадать с типом данных первичного ключа?

    Melkij
    @Melkij
    PostgreSQL DBA
    serial - это и есть integer, а типа данных serial вообще не существует. Это просто синтаксический сахар вокруг неявного создания sequence из времён, когда GENERATED ALWAYS AS IDENTITY не было ни в стандарте ни в postgresql.

    Обратно к вопросу: тип данных может не совпадать. Но обычно это ошибка схемы данных, нежели запланированное различие.
    Ответ написан
    Комментировать
  • Где найти недостающие куски пазла, что лежат между сеньором и архитектором?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Прежде всего, нет никакого "между". Сеньор - это грейд, а архитектор - это должность. Программисты в архитекторы не вырастают, а уходят, как и в менеджмент. По сути же вопроса, парадигмы, шаблоны проектирования и прочее можно выучить по книжкам, но по-настоящему понять можно только попав в условия, для которых они были придуманы. То есть это больше практический навык длительной работы в крупных, быстроизменяющихся проектах с большой командой. Ну, и стоит заметить, что проектирование систем - это не столько код, сколько стандарты, спецификации, схемы и ооочень много общения с бизнесом, разработкой, эксплуатацией, безопасниками и т.д. и т.п.
    Ответ написан