PostgreSQL 11.6 ON CONFLICT ON CONSTRAINT не вызывает обновление, но ограничение должно быть активировано - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть таблица, созданная примерно так:

create table change.payer
(
    account_id text not null
        constraint payer_account_id_pk
            primary key,
    entity_identifier text,
    entity_type text,
    name text,
    contact_information jsonb,
    etin text,
    document_fetched_at timestamp,
    created_at timestamp default CURRENT_TIMESTAMP not null
);

Я добавляю в нее данные, вот так:

        INSERT INTO change.payer (
            "account_id", "entity_identifier", "entity_type", "name",
            "contact_information", "etin", "document_fetched_at"
            )
        VALUES (
            %(account_id)s, %(entity_identifier)s, %(entity_type)s, %(name)s,
            %(contact_information)s, %(etin)s, %(document_fetched_at)s
            )
        ON CONFLICT ON CONSTRAINT payer_account_id_pk
        DO UPDATE SET
            entity_identifier = change.payer.entity_identifier,
            entity_type = change.payer.entity_type,
            name = change.payer.name,
            contact_information = change.payer.contact_information,
            etin = change.payer.etin,
            document_fetched_at = change.payer.document_fetched_at
        ;

По какой-то причине, когда я пишу новые строки с таким же account_id, обновлений не происходит. Я не уверен точно, что происходит, 1) я не получаю ошибки 2) я знаю, что данные меняются, потому что я вставляю каждую вещь в таблицу истории, таким образом я вижу изменение данных / временных меток 3) новые строки не записываются

по сути, ничего не меняется в change.payer, даже когда я пытаюсь сохранить новые данные, но новые строки записываются в мою таблицу истории.

1 Ответ

2 голосов
/ 23 апреля 2020

Оказывается, правая часть предложения set - это не таблица, в которую вы вставляете, а данные, которые вы хотите вставить. Кроме того, вы должны использовать ключевое слово EXCLUDED

, поэтому правильный запрос upsert для моего варианта использования будет:

        INSERT INTO change.payer (
            "account_id", "entity_identifier", "entity_type", "name",
            "contact_information", "etin", "document_fetched_at"
            )
        VALUES (
            %(account_id)s, %(entity_identifier)s, %(entity_type)s, %(name)s,
            %(contact_information)s, %(etin)s, %(document_fetched_at)s
            )
        ON CONFLICT ON CONSTRAINT payer_account_id_pk
        DO UPDATE SET
            entity_identifier = EXCLUDED.entity_identifier,
            entity_type = EXCLUDED.entity_type,
            name = EXCLUDED.name,
            contact_information = EXCLUDED.contact_information,
            etin = EXCLUDED.etin,
            document_fetched_at = EXCLUDED.document_fetched_at
        ;
...