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

PostgreSQL Upsert с клауза WHERE

Имате нужда от частичен индекс. Премахнете ограничението uniqe в колоната name и създайте частичен индекс на колоната:

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

Заявката трябва да изглежда така:

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)    

Обърнете внимание на правилното използване на специалния запис excluded. Според документацията:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на Docker за стартиране на уеб приложение, не можете да се свържете с Postgresql DB?

  2. Има ли конвенция за именувани аргументи във функция в PostgreSQL

  3. Грешка при създаване на PostgreSQL база данни с помощта на python, sqlalchemy и psycopg2

  4. Вмъкване на масив с помощта на Sequel gem в PostgreSQL

  5. Актуализирането на цяла колона от jsonb член е неуспешно с:колоната е от тип integer, но изразът е от тип jsonb