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

    SQL не предполагает условных выражений, но вы можете обновить данные с помощью UPSERT. В PostgreSQL 9.5+ реализуется следующим образом:

    CREATE TABLE users (
        steamid BIGINT PRIMARY KEY,
        balance DECIMAL NOT NULL,
        name VARCHAR(24) NOT NULL,
        avatar VARCHAR(2038) NOT NULL
    );
    
    INSERT INTO users (balance, steamid, name, avatar)
    VALUES (0, :steamid, :secondname, :avatar)
    ON CONFLICT (steamid) DO UPDATE
        SET name = excluded.name, avatar = excluded.avatar
    RETURNING (steamid);


    UPD: Обновил корректным и протестированым примером.
    `excluded` — алиас на данные с коллизией.

    Вместо конфликта по primary key можно отслеживать unique constraint violation:

    CREATE TABLE IF NOT EXISTS users (
        id SERIAL PRIMARY KEY,
        steamid BIGINT UNIQUE NOT NULL ,
        balance DECIMAL NOT NULL,
        name VARCHAR(24) NOT NULL,
        avatar VARCHAR(2038) NOT NULL
    );
    
    INSERT INTO users (balance, steamid, name, avatar)
    VALUES (0, :steamid, :secondname, :avatar)
    ON CONFLICT (steamid) DO UPDATE
        SET id = excluded.id, name = excluded.name, avatar = excluded.avatar
    RETURNING (steamid);
    Ответ написан
    4 комментария