62 votes

SQLite "INSERT OR REPLACE INTO" vs. "UPDATE ... WHERE"

Je n'ai jamais vu la syntaxe INSERT OR REPLACE INTO names (id, name) VALUES (1, "John") utilisé en SQL auparavant, et je me demandais pourquoi il était meilleur que le UPDATE names SET name = "John" WHERE id = 1 . Y a-t-il une bonne raison d'utiliser l'un plutôt que l'autre ? Cette syntaxe est-elle spécifique à SQLite ?

95voto

astander Points 83138

UPDATE ne fera rien si la ligne n'existe pas.

L'INSERT OR REPLACE insère la ligne si elle n'existe pas, ou remplace les valeurs si elle existe.

0 votes

Merci pour la réponse. S'agit-il d'une spécificité de SQLite ?

0 votes

Je n'ai pas connaissance de cette commande dans le serveur Sql, bien que ce dernier dispose désormais d'une commande MERGE. Et pour MS Access, je n'ai rien vu de tel non plus.

6 votes

Dans cette question stackoverflow.com/questions/690632/ il est indiqué que replace into supprime toujours la ligne en premier alors que update ne le fait pas

35voto

cybergen Points 678

Un autre fait à noter : INSERT OR REPLACE remplace toutes les valeurs non fournies dans l'instruction.

Par exemple, si votre table contient une colonne "lastname" pour laquelle vous n'avez pas fourni de valeur, INSERT OR REPLACE annulera "lastname" si possible (si les contraintes le permettent), ou échouera.

7 votes

+1 ; en d'autres termes, il faut toujours spécifier le numéro de téléphone de la personne à qui s'adresse la demande. ensemble complet de valeurs la ligne "mise à jour" devrait avoir - aucune valeur existante n'est préservée ; la raison de ce comportement est qu'il ne s'agit pas d'une ligne "mise à jour", mais d'une ligne "mise à jour". mise à jour pour une ligne existante, mais une suppression, suivie d'une réinsertion.

24voto

Hariboo Points 1
REPLACE INTO table(column_list) VALUES(value_list);

est une forme abrégée de

INSERT OR REPLACE INTO table(column_list) VALUES(value_list);

Pour que REPLACE s'exécute correctement, la structure de votre table doit comporter des lignes uniques, qu'il s'agisse d'une simple clé primaire ou d'un index unique.

REPLACE supprime, puis INSERTE l'enregistrement et provoque l'exécution d'un déclencheur INSERT si vous en avez configuré un. Si vous avez un déclencheur sur INSERT, vous pouvez rencontrer des problèmes.


Il s'agit d'une solution de contournement la vitesse n'a pas été vérifiée

INSERT OR IGNORE INTO table (column_list) VALUES(value_list);

suivi de

UPDATE table SET field=value,field2=value WHERE uniqueid='uniquevalue'

Cette méthode permet d'effectuer un remplacement sans provoquer de déclenchement.

5voto

Anonym Points 1229

La requête d'insertion ou de remplacement insère un nouvel enregistrement si id=1 n'existe pas déjà.

La requête de mise à jour ne mettrait à jour id=1 que s'il existe déjà, elle ne créerait pas de nouvel enregistrement s'il n'existe pas.

2 votes

Je ne pense pas que ce soit correct. La documentation sqlite (au 1er juillet 2010, version 3.6.23.1) dit que REPLACE is an alias for INSERT OR REPLACE et aurait donc le même comportement. D'après mon expérience, c'est le cas

0 votes

Je pense qu'il effectuera un effacement->insertion s'il trouve un conflit.

2 votes

@fostandy REPLACE est en effet un alias pour INSERT OR REPLACE, mais la réponse que vous commentez parle de UPDATE (parce que c'est ce sur quoi portait la question).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X