PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Masukkan, pada pembaruan duplikat di PostgreSQL?

PostgreSQL sejak versi 9.5 memiliki sintaks UPSERT, dengan klausa ON CONFLICT. dengan sintaks berikut (mirip dengan 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;

Mencari arsip grup email postgresql untuk "upsert" mengarah untuk menemukan contoh melakukan apa yang mungkin ingin Anda lakukan, dalam manual:

Contoh 38-2. Pengecualian dengan UPDATE/INSERT

Contoh ini menggunakan penanganan pengecualian untuk melakukan UPDATE atau INSERT, sebagaimana mestinya:

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');

Mungkin ada contoh bagaimana melakukan ini secara massal, menggunakan CTE di 9.1 dan di atasnya, di milis peretas:

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;

Lihat jawaban a_horse_with_no_name untuk contoh yang lebih jelas.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.lang.NoSuchFieldError:NONE dalam hibernasi dengan Spring 3, maven, JPA, c3p0

  2. Perbaiki “ERROR:  setiap kueri UNION harus memiliki jumlah kolom yang sama” di PostgreSQL

  3. Pilih tipe data bidang di postgres

  4. Batasan unik Postgres vs indeks

  5. Urutan tanpa celah PostgreSQL