sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL Upsert met een WHERE-clausule

U heeft een gedeeltelijke index nodig. Zet de unieke beperking op de kolom name en maak een gedeeltelijke index op de kolom:

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

De zoekopdracht zou er als volgt uit moeten zien:

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)    

Let op het juiste gebruik van het speciale record excluded. Volgens de documentatie:




  1. SqlAlchemy TIMESTAMP 'bij update' extra

  2. TEXTSIZE INSTELLEN Werkt niet in SQL Server? Controleer dit.

  3. Hoe het aantal seconden na middernacht in Oracle Database te retourneren?

  4. PHP Fatale fout:Klasse 'PDO' niet gevonden