Postgres: вставка нескольких строк при обновлении конфликта не работает - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь вставить несколько строк в таблицу и, в случае конфликта, просто обновить их. Что я делаю не так?

insert into segments(id, departure_hour) 
values 
    (1153, 2), 
    (1156, 4), 
    (1154, 2) 
on conflict do update set 
    departure_hour = c.departure_hour 
from (values 
    (1153, 2), 
    (1156, 4), 
    (1154, 2)) 
as c(id, departure_hour)
    where c.id = segments.id

По запросу, вот мое определение таблицы:

CREATE TABLE segments (
    id SERIAL PRIMARY KEY,
    route_id integer NOT NULL REFERENCES routes(id),
    origin_id integer NOT NULL REFERENCES stops(id),
    destination_id integer NOT NULL REFERENCES stops(id),
    price integer DEFAULT 0,
    departure_day integer NOT NULL,
    departure_hour integer NOT NULL,
    departure_minute integer NOT NULL,
    arrival_day integer NOT NULL,
    arrival_hour integer NOT NULL,
    arrival_minute integer NOT NULL,
    hidden boolean NOT NULL DEFAULT false,
    deleted boolean NOT NULL DEFAULT false,
    CONSTRAINT unique_origin_destination_per_route UNIQUE (route_id, origin_id, destination_id)
);

А вот моя ошибка:

ERROR:  syntax error at or near "from"
LINE 1: ...pdate set       departure_hour = c.departure_hour from (valu...

1 Ответ

1 голос
/ 31 октября 2019

Вам не нужна деталь from, чтобы можно было ссылаться на значения для обновления.

insert into segments(id, departure_hour) 
values 
    (1153, 2), 
    (1156, 4), 
    (1154, 2) 
on conflict do update set 
    departure_hour = excluded.departure_hour;
...