Синтаксис MERGE используется для UPSERT или INSERT при дублировании UPDATE - PullRequest
6 голосов
/ 29 декабря 2010

Итак, я пришел из MySQL, где я мог бы сделать ВСТАВИТЬ ОБНОВЛЕНИЕ ДУБЛИКАЦИИ :

INSERT INTO table (a,b,c) 
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

Но сейчас я использую PostgreSQL и пытаюсь добавить функциональность UPSERT, похоже, что MERGE может работать для того, что я хотел бы, но хотел бы узнать, является ли это наиболее оптимальным синтаксисом. Пример синтаксиса 1 , Я также видел это, но не понимаю, как реализовать . Я еще не пробовал это, потому что я думал, что MERGE использовался для объединения данных из таблицы 1 в таблицу 2 или что-то подобное?

MERGE
INTO    table
USING   table
ON      c = 1
WHEN MATCHED THEN
UPDATE
SET     c=c+1
WHEN NOT MATCHED THEN
INSERT  (a,b,c)
VALUES  (1,2,3)

Есть другие предложения?

Ответы [ 4 ]

13 голосов
/ 30 декабря 2010

Пока MERGE не доступен, используйте этот надежный подход: Вставить, при дублировании обновления в PostgreSQL?

3 голосов
/ 30 декабря 2010

Пока слияние не поддерживается, самый простой способ IMO - просто разбить его на два запроса:

BEGIN;
  INSERT INTO t (a,b,c) VALUES (1,2,3) WHERE id != 1;
  UPDATE t SET c=c+1 WHERE id = 1;
END;

где идентификатор будет изменен на соответствующее условие.

0 голосов
/ 29 декабря 2010

Я думаю, что "MERGE" еще не в Postgres, но предполагается в 9.1.

Мне нравится использовать RULE s вместо

CREATE OR REPLACE RULE "insert_ignore"
AS ON INSERT TO "table" WHERE
  NEW.id = OLD.id --whatever your conditions are
DO INSTEAD NOTHING;

То, на что вы ссылались («Вставить при повторном обновлении (postgresql)»), - это, по сути, какой-то pgsql, которым вы передаете данные. Я думаю, что ПРАВИЛО более элегантно, так как вам не нужно вызывать их явно, и они работают прозрачно в фоновом режиме без необходимости вызывать процедуру в вашей фактической INSERT.

0 голосов
/ 29 декабря 2010
MERGE INTO table
    USING (VALUES (1, 2, 3)) AS newvalues (a, b, c)
    ON table.c = newvalues.c  -- or whatever the PK is
    WHEN MATCHED THEN UPDATE SET c = c + 1
    WHEN NOT MATCHED THEN INSERT (a, b, c)
                              VALUES (newvalues.a, newvalues.b, newvalues.c)

Ключевым моментом здесь является то, что вместо слияния с другой таблицей вы создаете источник постоянной таблицы, используя конструкцию VALUES в предложении USING. Точные правила слияния, которые вы, очевидно, можете адаптировать по вкусу.

См. Также http://petereisentraut.blogspot.com/2010/05/merge-syntax.html.

...