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
Libérer: 2025-01-12 17:44:43
original
446 Les gens l'ont consulté

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>
Copier après la connexion
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion
Copier après la connexion

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>
Copier après la connexion

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

<code class="language-sql">SELECT * FROM t;</code>
Copier après la connexion

Sortie :

<code> id | a |  b  
----+---+-----
  1 | a | bar</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal