Maison >base de données >tutoriel mysql >Comment gérer plusieurs cibles de conflit dans la clause ON CONFLICT de PostgreSQL ?

Comment gérer plusieurs cibles de conflit dans la clause ON CONFLICT de PostgreSQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-12 17:44:43447parcourir

How to Handle Multiple Conflict Targets in PostgreSQL's ON CONFLICT Clause?

Utilisation de plusieurs cibles de conflit dans la clause ON CONFLICT

Si la table contient plusieurs colonnes uniques et que la syntaxe INSERT ... ON CONFLICT ... DO UPDATE est requise pour mettre à jour d'autres colonnes en cas de conflit, vous devez créer un index unique contenant toutes les colonnes cibles du conflit.

Question :

Lorsque vous essayez d'utiliser plusieurs colonnes comme cibles de conflit dans une clause ON CONFLICT, une erreur se produit car un index unique est requis pour effectuer la détection des conflits. Prenons l'exemple suivant :

<code class="language-sql">INSERT INTO table
...
ON CONFLICT (col1, col2)
DO UPDATE
SET
....</code>

Solution :

Pour résoudre ce problème, créez un index unique sur les deux colonnes :

<code class="language-sql">CREATE UNIQUE INDEX idx_t_col1_col2 ON table (col1, col2);</code>

Après avoir créé un index unique, la clause ON CONFLICT peut spécifier deux colonnes comme cibles de conflit pour obtenir le comportement de mise à jour souhaité en cas de conflit :

<code class="language-sql">INSERT INTO table
...
ON CONFLICT (col1, col2)
DO UPDATE
SET
....</code>

Exemple :

Créez un tableau avec des colonnes uniques id et a et insérez des données tout en gérant les conflits :

<code class="language-sql">CREATE TABLE t (id integer, a text, b text);
CREATE UNIQUE INDEX idx_t_id_a ON t (id, a);
INSERT INTO t VALUES (1, 'a', 'foo');
INSERT INTO t VALUES (1, 'a', 'bar') ON CONFLICT (id, a) DO UPDATE SET b = 'bar';</code>

Exécutez une requête pour vérifier les données mises à jour :

<code class="language-sql">SELECT * FROM t;</code>

Sortie :

<code> id | a |  b  
----+---+-----
  1 | a | bar</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn