У меня есть одна таблица, созданная как местоположение (города в мире).
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 для выполнения обеих ситуаций?Спасибо.