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!