Postgresql UPSERT с несколькими уникальными ограничениями - PullRequest
0 голосов
/ 11 октября 2018

У меня есть одна таблица, созданная как местоположение (города в мире).

CREATE TABLE location (
    location_id BIGSERIAL PRIMARY KEY,
    location_name VARCHAR(100) NOT NULL,
    state_id INT,
    country_id INT NOT NULL,
    UNIQUE (location_name, state_id, country_id),
    FOREIGN KEY (state_id) REFERENCES state (state_id)
    ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (country_id) REFERENCES country (country_id)
    ON UPDATE CASCADE ON DELETE CASCADE
    );

CREATE UNIQUE INDEX loc_1_uni_idx ON location (location_name, country_id)
    WHERE state_id IS NULL;

Эта таблица имеет две проверки уникальности: location_name + country_id, если state_id равен нулю, и location_name + state_id + country_id, если для state_id естьзначение.

В настоящее время я хотел бы выполнить upsert в эту таблицу.Я мог бы выполнить конфликт в любом из упомянутых выше случаев:

INSERT INTO location(location_name, state_id, country_id) VALUES %s 
ON CONFLICT (location_name, state_id, country_id) 
DO UPDATE 
   SET country_id = EXCLUDED.country_id 
RETURNING location_id;

INSERT INTO location(location_name, state_id, country_id) VALUES %s 
ON CONFLICT (location_name, country_id) 
   WHERE state_id IS NULL 
DO UPDATE SET country_id = EXCLUDED.country_id 
RETURNING location_id;

Однако, поскольку state_id может или не может представить, как я могу выполнить одно upsert для выполнения обеих ситуаций?Спасибо.

...