2016-11-02 2 views
1

Я хочу обновить строку с помощью инструкции insert. В самом деле, я могу вставлять строки, но если уникальный атрибут уже существует, я бы хотел обновить содержимое.Обновить новое значение при конфликте

Так что я получил эти таблицы

CREATE TABLE dtest (
    "id" text, 
    followers_count int4, 
    someuniq int4 
); 
CREATE UNIQUE INDEX dtest_idx ON dtest USING btree (someuniq); 

CREATE TABLE temp_data (
    tid text, 
    tfo int4, 
    tuniq int4); 

Будет считать, что у меня есть вкладка Темпа, и я вставить данные/обновления из этой таблицы

INSERT INTO temp_data VALUES ('id1',4,1); 
INSERT INTO temp_data VALUES ('id2',0,2); 
INSERT INTO temp_data VALUES ('id3',40,3); 


INSERT INTO dtest("id","followers_count","someuniq") 
SELECT t.tid, t.tfo, t.tuniq 
FROM temp_data t 
ON CONFLICT DO NOTHING; 

Вместо того чтобы делать вставку и затем обновление , Я хотел бы знать, можно ли обновить значения примерно так

INSERT INTO dtest("id","followers_count","someuniq") 
SELECT tid, tfo, tuniq 
FROM temp_data 
ON CONFLICT ("someuniq") 
DO UPDATE SET followers_count = 
     (SELECT tfo FROM temp_data where tid = EXCLUDED.tid) 
    WHERE EXCLUDED.id = tid; 

Wic h означает «Обновить некоторые поля, если строка уже существует», что я делаю неправильно?

ответ

1

Нет необходимости использовать подвыбор. Строка excluded будет содержать все целевые столбцы, включая followers_count:

INSERT INTO dtest (id, followers_count, someuniq) 
SELECT tid, tfo, tuniq 
FROM temp_data 
ON CONFLICT (someuniq) 
DO UPDATE 
    SET followers_count = excluded.followers_count; 
Смежные вопросы