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

PostgreSQL Upsert với mệnh đề WHERE

Bạn cần một chỉ mục một phần. Bỏ ràng buộc uniqe trên cột name và tạo chỉ mục một phần trên cột:

CREATE TABLE customers (
    customer_id serial PRIMARY KEY,
    name VARCHAR,
    email VARCHAR NOT NULL,
    active bool NOT NULL DEFAULT TRUE
);

CREATE UNIQUE INDEX ON customers (name) WHERE active;

INSERT INTO customers (NAME, email) VALUES
 ('IBM', '[email protected]'),
 ('Microsoft', '[email protected]'),
 ('Intel','[email protected]');

Truy vấn sẽ giống như sau:

INSERT INTO customers (name, email)
VALUES
    ('Microsoft', '[email protected]') 
ON CONFLICT (name) WHERE active
DO UPDATE SET email = excluded.email;

SELECT *
FROM customers;

 customer_id |   name    |         email         | active 
-------------+-----------+-----------------------+--------
           1 | IBM       | [email protected]       | t
           3 | Intel     | [email protected]     | t
           2 | Microsoft | [email protected] | t
(3 rows)    

Lưu ý việc sử dụng hợp lý bản ghi đặc biệt excluded. Theo tài liệu:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Định dạng ngày tháng trong PostgreSQL

  2. PostgreSQL regexp_replace với biểu thức phù hợp

  3. Cách sử dụng các phép nối bên trong với các truy vấn con trong Laravel Eloquent

  4. Postgres UUID JDBC không hoạt động

  5. Một số trường hợp khi có đầu ra trên cùng một hàng