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: