Ответы пользователя по тегу PostgreSQL
  • Почему тип столбца xml не проверяет входное значение?

    @Akina
    Сетевой и системный админ, SQL-программист.
    При этом по факту я спокойно вставляю в таблицу произвольную строку и никакой проверки не происходит, данные спокойно записываются в таблицу.

    Произвольный текст, не содержащий тегов, является валидным содержимым, но не XML документом. Не-XML фрагмент игнорируется при проверке.

    Попробуйте вставить нечто, являющееся документом/фрагментом XML, но с ошибкой в разметке - тут же схлопочете ошибку.
    DEMO
    Ответ написан
    Комментировать
  • Где ошибка в строке запроса к PosgreSQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В запросе, использующем более одной таблицы, все имена полей должны указываться как минимум с алиасом таблицы.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    ОШИБКА: в целевой внешней таблице "users" нет ограничения уникальности, соответствующего данным ключам

    Ошибка указывает на проблему, связанную со следующим внешним ключом:

    FOREIGN KEY(user_id) REFERENCES users (user_id)

    Таблица users должна существовать.
    В ней должно существовать поле user_id.
    Это поле должно быть определено как уникальное. Причём отдельно, а не в составе композитного уникального индекса.

    Так что смотрите, что именно нагенерила модель.

    PS. Если определено PRIMARY KEY (user_id), то дополнительное UNIQUE (user_id) абсолютно бессмысленно.
    Ответ написан
    Комментировать
  • Как обновить сразу все записи с уникальным ключом?

    @Akina
    Сетевой и системный админ, SQL-программист.
    create table test(
      id SERIAL PRIMARY KEY,
      num int,
      t text,
      constraint u_constrainte unique (num, t) DEFERRABLE 
    )

    https://dbfiddle.uk/VuwdSZSH

    Можно ли как то сделать сортировку того что нужно обновить перед тем как собственно обновлять записи?

    Нет.
    Ответ написан
    3 комментария
  • Как задать свой тип?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Можно использовать ENUM, как уже предложили.

    Можно просто добавить ограничение (CHECK constraint) - тогда любое не соответствующее ограничению значение приведёт к ошибке вставки/обновления:

    CREATE TABLE video (
      id INTEGER,
       ...,
      type VARCHAR CHECK (type IN ('FILM', 'SERIAL')),
      ...
    );
    Ответ написан
    Комментировать
  • Как получить значения и вставить в функцию?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как-то вот так:
    SELECT *
    FROM table t1 
    JOIN table t2
    WHERE t1.id > t2.id
      AND ST_Intersect(t1.geom, t2.geom)
    Ответ написан
    Комментировать
  • Является ли приемлимой практикой использование JSON обьектов в столбцах таблицы базы данных PostgreSQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если говорить об общем подходе - JSON в БД должен использоваться только и исключительно в случае, когда вся работа с JSON ограничивается простейшим "записать в БД" - "извлечь из БД". При этом модификация в момент записи/извлечения можно не учитывать.

    Если же JSON используется более нагруженно (поиск, сравнение, частичная модификация и пр.), то в большинстве случаев от его использования следует отказываться в пользу нормализованных plain-структур. При правильном индексировании они выиграют у JSON по потреблению ресурсов сервера. Хотя, конечно, в каждом отдельном случае нужно смотреть конкретные условия - тип использования, возможности оптимизации этого процесса в конкретной (версии) СУБД и пр. Да и то, JSON тут реально может конкурировать разве что с EAV.
    Ответ написан
    2 комментария
  • Как сгруппировать ответ?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH
    cte1 AS (
      SELECT jsonb_build_object('name',   users.name, 
                               'value',  comments.value,
                               'rating', comments.rating) single_user,
             comments.order_id,
             'comment' || ROW_NUMBER() OVER (PARTITION BY comments.order_id ORDER BY comments.id) num
      FROM users
      JOIN comments ON users.id = comments.user_id
    ),
    cte2 AS (
      SELECT jsonb_build_object('order_id', order_id) ||
             jsonb_object_agg(num, single_user) single_order
      FROM cte1
      GROUP BY order_id
    )
    SELECT jsonb_agg(single_order) final_data
    FROM cte2;

    DEMO fiddle
    Ответ написан
    Комментировать
  • Почему возникает ошибка при использовании оконной функции?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Проблема в том, что после группировки поля исходных таблиц недоступны, если они не включены в выражение группировки.

    Правильно:

    SELECT "Items"."itemId", sum(price) / sum( sum(price) ) OVER ()
    FROM "Items"
    INNER JOIN "Purchases" USING("itemId")
    GROUP BY "Items"."itemId"


    Т.е. оконная функция применяется не к исходному полю, а к агрегатной функции.
    Ответ написан
    2 комментария
  • Как убрать кавычки из ответа sql запроса с json?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT DISTINCT value::jsonb->>'name_level_1'
    ...
    Ответ написан
    Комментировать
  • Как заменить значение в поле postgresql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    UPDATE table 
    SET value_column = REGEXP_REPLACE(value_column, '777\n?', '888');
    Ответ написан
    Комментировать
  • Как удалить таблицу postgresql по условию?

    @Akina
    Сетевой и системный админ, SQL-программист.
    with cte (cnt) as (
      select count(*)
      from test_sender 
      where statuse='crash'
      )
    delete 
      from test_sender 
      using cte
      where cte.cnt = 0;
    Ответ написан
  • Как правильно сделать запрос с поиском текста?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Видимый выход - парсить запрос на токены, запрашивать по каждому токену, отбирать записи с хотя бы одним вхождением, сортировать по количеству вхождений (или, например, по суммарной длине найденных токенов).
    Ответ написан
    Комментировать
  • Sequelize, как начать поиск элемента в таблице с конца?

    @Akina
    Сетевой и системный админ, SQL-программист.
    начать поиск элемента в таблице в БД с конца

    В таблице нет ни начала, ни конца. Таблица - это несортированная куча. Если нужен какой-то порядок записей - его следует указать явно выражением сортировки.

    как получить id последнего элемента в таблице?

    Последний (при какой-то сортировке) - это первый при обратной сортировке.
    Так что надо просто указать сортировку (обратную той, которую ты считаешь "прямой") и взять только первую запись.
    Ответ написан
    1 комментарий
  • Триггер UPDATE с условием?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Пример
    CREATE FUNCTION fn_test() 
    RETURNS TRIGGER
    AS $fn_test$
    BEGIN
        IF OLD.val1 <> NEW.val1 THEN   -- задать условие
            NEW.id := NEW.id * 10;     -- выполнить действие
        END IF;
        RETURN NEW;
    END;
    $fn_test$ LANGUAGE plpgsql;

    CREATE TRIGGER tr_test
    BEFORE UPDATE ON test
    FOR EACH ROW
    EXECUTE FUNCTION fn_test();

    DEMO

    Или так:
    CREATE FUNCTION fn_test() 
    RETURNS TRIGGER
    AS $fn_test$
    BEGIN
        NEW.id := NEW.id * 10;     -- выполнить действие
        RETURN NEW;
    END;
    $fn_test$ LANGUAGE plpgsql;

    CREATE TRIGGER tr_test
    BEFORE UPDATE ON test
    FOR EACH ROW
    WHEN (OLD.val1 <> NEW.val1)   -- задать условие
    EXECUTE FUNCTION fn_test();

    DEMO
    Ответ написан
    2 комментария
  • Как создать тригер для дефолтного значения?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE TABLE trs (
        wallet_id INT, 
        amount DECIMAL(12, 2), 
        hash BYTEA GENERATED ALWAYS AS (sha256((wallet_id + amount) :: TEXT :: BYTEA)) STORED
    )

    из конкатенированный строки wallet_id + hash

    Вообще-то оба поля чисельные - какая в пень конкатенация-то? Но если их надо преобразовать в строку и конкатенировать, то
    CREATE TABLE trs (
        wallet_id INT, 
        amount DECIMAL(12, 2), 
        hash BYTEA GENERATED ALWAYS AS (sha256((wallet_id :: TEXT || amount :: TEXT) :: BYTEA)) STORED
    )
    Ответ написан
    1 комментарий
  • Rак записать id в Postgres?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Использовать надо INSERT .. SELECT
    WITH cte_id  AS (
        INSERT INTO words (name_word, discription_word) 
        VALUES ('cool', 'круто') 
        RETURNING Id
    )
    INSERT INTO users_words (users_id, words_id, status_learn_word)
    SELECT 649651821, id , 0
    FROM cte_id;
    Ответ написан
    Комментировать
  • Можно ли в postgres выполнить условную сортировку?

    @Akina
    Сетевой и системный админ, SQL-программист.
    select * 
    from products 
    order by type ASC,
             case WHEN type = 'books' then id      ELSE 0 END desc,
             case WHEN type = "food"  then name    ELSE 0 END asc,
             case WHEN type = "food"  then price   ELSE 0 END desc,
             case WHEN type = "relax" THEN popular ELSE 0 END asc,
             case WHEN type = "relax" THEN id      ELSE 0 END desc
    Ответ написан
    Комментировать
  • Как реализовать алгоритм экспайринга элементов в базе данных?

    @Akina
    Сетевой и системный админ, SQL-программист.
    По-моему, ты накрутил сверх меры. Всё решается куда проще.

    Структура таблицы, максимально упрощённая:
    CREATE TABLE tasks (
        id PRIMARY KEY,
        definition,
        performer_id REFERENCES performer (id)
        expired_at DATETIME
    );

    Взятие (параметры - id обработчика и id задачи):
    UPDATE tasks
    SET performer_id = @performer_idб
        expired_at  = NOW() + INTERVAL 'performing time'
    WHERE ( expired_at IS NULL or expired_at < NOW() )
      AND ( id = @task_id )

    То есть, задачу можно взять, если её ещё никто не брал, или если время ожидания ответа на задачу истекло. И в качестве бонуса - видно, что либо задачу никто не брал, либо кто-то брал (только последний, если таких было несколько) и прогавал сроки.

    performing time может либо поставляться снаружи как параметр, либо быть свойством задачи (с соотв. полем в структуре таблицы).
    Ответ написан
    8 комментариев
  • Как разбить Date и Time в PostgreSQL запросе?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ну что за детский сад?

    SELECT '2022-04-01 09:23:45'::DATE, '2022-04-01 09:23:45'::TIME
    Ответ написан
    Комментировать