Remplacer Dans La Syntaxe De La Requête

Je veux pouvoir mettre à jour une table du même schéma en utilisant une instruction "replace into". En fin de compte, je dois être en mesure de mettre à jour une grande table avec des valeurs qui peuvent avoir changé.

Voici la requête que j'utilise commencer:

REPLACE INTO table_name
(visual, inspection_status, inspector_name, gelpak_name, gelpak_location),
VALUES (3, 'Partially Inspected', 'Me', 'GP1234', 'A01');

Ce que je ne comprends pas, c'est comment le moteur de base de données sait-il ce qui est une ligne en double et ce qui ne l'est pas? Ces données sont extrêmement importantes et je ne peux pas risquer que les données soient corrompues. Est-ce aussi simple que "si toutes les colonnes ont la même la valeur, c'est une ligne en double"?

J'essaie juste de trouver un moyen efficace de le faire afin que je puisse mettre à jour > 45 000 lignes en moins d'une minute.

36
demandé sur peterm 2013-11-06 23:11:59

2 réponses

Comme le dit la documentation :

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é primaire ou un index UNIQUE, l'ancienne ligne est supprimée avant l'insertion de la nouvelle ligne.

68
répondu Filipe Silva 2013-11-06 19:13:31

REPLACE fonctionne un peu comme un INSERT qui vient remplace les enregistrements qui ont le même PRIMARY KEY ou UNIQUE index, cependant, méfiez-vous.

Shlomi Noach écrit sur le problème de l'utilisation de REPLACE INTO ici:

Mais les gens au cœur faible comme moi devraient être conscients de ce qui suit: c'est une solution lourde. C'est peut-être exactement ce que vous cherchiez en termes de facilité d'utilisation, mais le fait est que sur les clés en double, une suppression et une insertion sont effectuées, ce qui appelle un regarder de plus près.

Chaque fois qu'une ligne est supprimée, tous les index doivent être mis à jour, et surtout la clé primaire. Lorsqu'une nouvelle ligne est insérée, la même chose se produit. Surtout sur les tables InnoDB (en raison de leur nature clusterisée), cela signifie beaucoup de frais généraux. La restructuration d'un indice est une opération coûteuse. Les nœuds d'Index peuvent avoir besoin d'être fusionnés lors de la suppression. Les nœuds peuvent avoir besoin d'être divisés en raison de L'insertion. Après de nombreux remplacements en exécutions, il est fort probable que votre index soit plus fragmenté que cela aurait été, si vous aviez utilisé SELECT / UPDATE ou INSERT INTO ... SUR LA CLÉ EN DOUBLE

Aussi, il y a la notion de " eh bien, si la ligne n'est pas là, nous la créons. Si c'est là, il est simplement mis à jour". C'est faux. La ligne n'est pas seulement mise à jour, elle est complètement supprimée. Le problème est que s'il y a une clé primaire sur cette table et que le REPLACE INTO ne spécifie pas de valeur pour la clé primaire (par exemple, c'est une colonne AUTO_INCREMENT), la nouvelle ligne obtient une valeur différente, et ce n'est peut-être pas ce que vous cherchiez en termes de comportement.

De nombreuses utilisations de REPLACE INTO n'ont pas l'intention de changer les valeurs de clé primaire (ou D'autres Clés uniques). Dans ce cas, il est préférable de le laisser seul. Sur un système de production que j'ai vu, changer remplacer dans pour insérer dans ... Sur la clé DPLICATE a entraîné un débit dix fois plus élevé (mesuré en requêtes par seconde) et une diminution drastique des opérations D'E / S et de la moyenne de charge.

En résumé, REPLACE INTO peut - être juste pour votre implémentation, mais vous pourriez le trouver plus approprié (et moins risqué) à utiliser INSERT ... ON DUPLICATE KEY UPDATE au lieu de cela.

10
répondu mahatma_andy 2018-01-15 18:47:14