PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chèn, trên bản cập nhật trùng lặp trong PostgreSQL?

PostgreSQL kể từ phiên bản 9.5 có cú pháp UPSERT, với mệnh đề BẬT MÂU THUẪN. với cú pháp sau (tương tự như 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;

Tìm kiếm kho lưu trữ nhóm email của postgresql cho "upert" dẫn đến việc tìm thấy một ví dụ về việc bạn có thể muốn làm, trong sách hướng dẫn:

Ví dụ 38-2. Ngoại lệ với UPDATE / INSERT

Ví dụ này sử dụng xử lý ngoại lệ để thực hiện CẬP NHẬT hoặc CHÈN, nếu thích hợp:

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

Có thể có một ví dụ về cách thực hiện điều này hàng loạt, bằng cách sử dụng CTE trong 9.1 trở lên, trong danh sách gửi thư của tin tặc:

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;

Xem câu trả lời của a_horse_with_no_name để có ví dụ rõ ràng hơn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đọc cam kết là điều bắt buộc đối với cơ sở dữ liệu SQL phân tán tương thích với Postgres

  2. Tương lai của Postgres-XL

  3. Điền nhiều trường 2many (odoo 8)

  4. PostgreSQL đang trỗi dậy:Phát hiện Postgres 2018 &Xu hướng 2019

  5. Chia sẻ kết nối với db postgres trên các quy trình bằng Python