Maison >base de données >tutoriel mysql >Comment UPSERT de SQLite gère-t-il efficacement les mises à jour partielles et les insertions ?
Comprendre la fonctionnalité UPSERT de SQLite
L'opération UPSERT, une combinaison de INSERT et UPDATE, gère efficacement la modification des données en mettant à jour les enregistrements existants ou en en insérant de nouveaux selon les besoins. Bien que SQLite prenne directement en charge UPSERT, l'optimisation de son utilisation pour les mises à jour partielles nécessite une réflexion approfondie.
Syntaxe UPSERT de SQLite
Introduite dans SQLite version 3.24.0, la clause ON CONFLICT
permet un contrôle UPSERT précis. Par exemple :
<code class="language-sql">INSERT OR REPLACE INTO table (id, name) VALUES (1, 'John Foo') ON CONFLICT(id) DO UPDATE SET name = 'John Foo';</code>
Cela met à jour le champ name
si un enregistrement avec le id
correspondant existe ; sinon, il insère une nouvelle ligne.
Résolution des mises à jour partielles
Gérer les mises à jour partielles (modifier uniquement des colonnes spécifiques tout en laissant les autres intactes) présente un défi. Considérez ce scénario : mettez à jour Blob1
et Blob2
, mais laissez Blob3
inchangé si l'enregistrement existe ; si ce n'est pas le cas, définissez Blob3
sur NULL.
Solution de mise à jour partielle efficace
La clause ON CONFLICT
apporte une solution élégante :
<code class="language-sql">INSERT INTO table (id, Blob1, Blob2, Blob3) VALUES (1, 'Data1', 'Data2', NULL) ON CONFLICT(id) DO UPDATE SET Blob1 = 'Data1', Blob2 = 'Data2';</code>
Cette approche met à jour uniquement Blob1
et Blob2
lorsqu'un conflit (correspondance id
) se produit. Il est important de noter que si l'enregistrement est absent, le INSERT
définit Blob3
sur NULL comme spécifié.
Méthodes alternatives (moins efficaces)
Alternativement, une combinaison SELECT
et REPLACE
peut obtenir le même résultat :
<code class="language-sql">SELECT name INTO @name FROM Employee WHERE id = 1; REPLACE INTO Employee (id, role) VALUES (1, 'code monkey', @name);</code>
Cela préserve la name
valeur originale en la lisant au préalable. Cependant, cette méthode introduit généralement plus de frais généraux par rapport à l'approche ON CONFLICT
.
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!