PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Вмъкване при дублирана актуализация в PostgreSQL?

PostgreSQL от версия 9.5 има синтаксис UPSERT с клауза ON CONFLICT. със следния синтаксис (подобен на MySQL)

INSERT INTO the_table (id, column_1, column_2) 
VALUES (1, 'A', 'X'), (2, 'B', 'Y'), (3, 'C', 'Z')
ON CONFLICT (id) DO UPDATE 
  SET column_1 = excluded.column_1, 
      column_2 = excluded.column_2;

Търсенето в архивите на имейл групите на postgresql за "upsert" води до намиране на пример за това, което евентуално искате да направите, в ръководството:

Пример 38-2. Изключения с UPDATE/INSERT

Този пример използва обработка на изключения за извършване на UPDATE или INSERT, според случая:

CREATE TABLE db (a INT PRIMARY KEY, b TEXT);

CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS
$$
BEGIN
    LOOP
        -- first try to update the key
        -- note that "a" must be unique
        UPDATE db SET b = data WHERE a = key;
        IF found THEN
            RETURN;
        END IF;
        -- not there, so try to insert the key
        -- if someone else inserts the same key concurrently,
        -- we could get a unique-key failure
        BEGIN
            INSERT INTO db(a,b) VALUES (key, data);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- do nothing, and loop to try the UPDATE again
        END;
    END LOOP;
END;
$$
LANGUAGE plpgsql;

SELECT merge_db(1, 'david');
SELECT merge_db(1, 'dennis');

Вероятно има пример как да направите това на едро, като използвате CTE в 9.1 и по-горе, в пощенския списък на хакерите:

WITH foos AS (SELECT (UNNEST(%foo[])).*)
updated as (UPDATE foo SET foo.a = foos.a ... RETURNING foo.id)
INSERT INTO foo SELECT foos.* FROM foos LEFT JOIN updated USING(id)
WHERE updated.id IS NULL;

Вижте отговора на a_horse_with_no_name за по-ясен пример.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres копирайте Heroku Production DB към локалната база за разработка

  2. Създаване на копие на база данни в PostgreSQL

  3. Експертно ръководство за Slony репликация за PostgreSQL

  4. Най-новите тенденции в PostgreSQL:Най-отнемащи време задачи и важни показатели за проследяване

  5. Върнете идентификатора, ако съществува ред, INSERT в противен случай