web-dev-qa-db-fra.com

REPLACE vs INSERT en SQL

Je fais le tutoriel SQL suivant: http://sql.learncodethehardway.org/book/ex11.html

et dans cet exercice, l'auteur dit dans le deuxième paragraphe:

Dans cette situation, je veux remplacer mon dossier par un autre gars mais conservez l'identifiant unique. Le problème est que je devrais soit faire un DELETE/INSERT dans une transaction pour le rendre atomique, ou je devrais faire une mise à jour complète.

Quelqu'un pourrait-il m'expliquer quel est le problème avec une mise à jour et quand nous pourrions choisir REPLACE au lieu de UPDATE?

Le code UPDATE:

UPDATE person SET first_name = "Frank", last_name = "Smith", age = 100
    WHERE id = 0;

Voici le code REPLACE:

REPLACE INTO person (id, first_name, last_name, age)
    VALUES (0, 'Frank', 'Smith', 100);

EDIT: Je suppose qu’une autre question que je me pose est la suivante: pourquoi feriez-vous jamais un DELETE/INSERT au lieu d’un simple UPDATE comme indiqué dans la section citée?

14
jcm

Selon la documentation , la différence est la suivante:

REPLACE fonctionne exactement comme INSERT, sauf que si une ancienne ligne de la table a la même valeur qu'une nouvelle ligne pour une clé PRIMARY KEY ou un index UNIQUE, l'ancienne ligne est supprimée avant que la nouvelle ligne ne soit insérée.

Alors qu'est-ce qu'il fait:

  • Essayez de faire correspondre la ligne en utilisant l’un des index disponibles;
  • Si la ligne n'existe pas déjà: ajoutez-en une nouvelle;
  • Si la ligne existe déjà: supprimez la ligne existante et ajoutez-en une nouvelle par la suite.

Quand est-ce que cela peut devenir utile sur des instructions insert et update distinctes?

  • Vous pouvez appeler ceci en toute sécurité et vous n'avez pas à vous soucier des lignes existantes (une instruction par rapport à deux);
  • Si vous souhaitez que les données associées soient supprimées lorsque inserting/updating, vous pouvez utiliser replace: toutes les données associées sont également supprimées);
  • Lorsque les déclencheurs doivent être déclenchés et que vous vous attendez à une insert (mauvaise raison, d'accord).
16
Patrick Hofman

Premier remplacement n'est pas largement compris dans tous les moteurs de base de données.

Deuxièmement, remplace/insère/met à jour un enregistrement basé sur la clé primaire. Avec Update, vous pouvez spécifier des conditions plus élaborées:

UPDATE person SET first_name = 'old ' + first_name WHERE age > 50

UPDATE ne créera pas non plus d'enregistrements.

3
FooLman

La mise à jour modifiera la valeur des enregistrements existants dans la table en fonction d'une condition particulière. Vous pouvez donc modifier un ou plusieurs enregistrements en une seule requête.

Insérer ou remplacer insérera un nouvel enregistrement si aucun enregistrement n'est présent dans la table, sinon il sera remplacé. Remplacer ne fonctionnera que si et seulement si vous fournissez la valeur de clé primaire dans la requête d'insertion ou de remplacement. Si vous oubliez d'ajouter la valeur du champ de clé primaire, un nouvel enregistrement sera créé dans la table.

Exemple de cas: - 

Mise à jour: Vous devez calculer les salaires à l'aide d'une formule utilisant les valeurs des colonnes. Dans ce cas, vous utiliserez toujours la requête de mise à jour car, en utilisant une seule requête, vous pouvez mettre à jour plusieurs enregistrements.

Insérer ou remplacer: Déjà mentionné dans le lien que vous avez partagé.

1
Rajen Raiyarela

UPDATE n'aura aucun effet si la ligne n'existe pas.

Où comme INSERT ou REPLACE sera inséré si la ligne n'existe pas ou remplace les valeurs s'il existe.