# MySQL/Manipulation de données

* Introduction
* PhpMyAdmin
* Parcourir les bases de données
* Spécifier les noms
* LDD, LMD et LCD
* Variables utilisateurs
* Alias
* Types de données
* Manipulation de base
** mysqldump
* Manipulation de table
* Manipulation de données
* Requêtes
* NULL
* Opérateurs
* Fonctions
* Procédures stockées
* Regex
* Bases de données spatiales
* Importer et exporter
* Réplication
* Optimisation
* API
* Sécurité
* Mots réservés
* Débogage
* Introduction
* PhpMyAdmin
* Parcourir les bases de données
* Spécifier les noms
* LDD, LMD et LCD
* Variables utilisateurs
* Alias
* Types de données
* Manipulation de base
** mysqldump
* Manipulation de table
* Manipulation de données
* Requêtes
* NULL
* Opérateurs
* Fonctions
* Procédures stockées
* Regex
* Bases de données spatiales
* Importer et exporter
* Réplication
* Optimisation
* API
* Sécurité
* Mots réservés
* Débogage
[ Modifier le sommaire ]

## INSERT

La syntaxe est la suivante :
Ce qui effectue les opérations suivantes : insert value1 into Column1, value2 into Column2, and value3 into Column3.
Insérer un enregistrement (les valeurs sont insérées dans l'ordre où les colonnes apparaissent dans la base) :
Il vaut mieux sélectionner chaque champ à copier sinon la contrainte d'unicité sur la clé primaire peut faire échouer l'insertion.
Astuces de performances :
* Pour insérer plusieurs lignes depuis un fichier, utiliser LOAD DATA INFILE de préférence (bulk insert).
* Si un gros volume d'insertion est trop lent sur des tables indexées non vides, augmenter la valeur de bulk_insert_buffer_size.
* Avant des insertions en masse, retirer les clés.
* Verrouiller une table (LOCK) accélère les INSERT.

## UPDATE

Exemples :
Avec ORDER BY il est possible de classer les enregistrements avant l'insertion, voire même sur un nombre donné de lignes (avec LIMIT).
Astuces de performances :
* La vitesse des UPDATE dépend du nombre d'index mis à jour.
* En cas d'UPDATE d'une table MyISAM au format dynamique, les colonnes larges causes des lectures de mémoire superflues. Il faut régulièrement lancer OPTIMIZE TABLE pour les réduire à la taille de leur contenu.
* Lancer plein d'UPDATE en même temps sur une table verrouillée est plus rapide qu'individuellement.
* Ajouter FOR UPDATE à la fin d'un SELECT sur une table InnoDB, prépare les locks nécessaires pour ne pas que ces données changent avant un UPDATE les utilisant.
La fonction replace est sensible à la casse même avec les collations insensibles.

## REPLACE

REPLACE fonctionne depuis MySQL 5.5, en remplaçant un enregistrement par un autre, exactement comme DELETE + INSERT, sauf que si l'ancien enregistrement a la même valeur que le nouveau en tant que PRIMARY KEY ou UNIQUE index, l'ancien est supprimé avant l'insertion du nouveau.
Ne pas confondre avec replace.

## IGNORE

Pour éviter qu'une insertion soit interdite par une contrainte d'intégrité (ex : clé primaire en double), le mot IGNORE (dans "INSERT IGNORE" ou "REPLACE IGNORE") affiche juste des avertissements si une insertion est ignorée.
Avant MySQL 4.0.1, INSERT ... SELECT opérait implicitement en mode IGNORE : en ignorant les enregistrements qui causeraient des erreurs de valeur de clé dupliquée.

## DELETE et TRUNCATE

Quelques précisions :
* Utiliser DELETE sans clause WHERE, supprime tous les enregistrements.
* Si une table contient beaucoup d'index, on peut agrandir le cache pour accélérer les DELETE (variable key_buffer_size).
* Pour les tables indexées MyISAM, parfois DELETE est plus rapide en spécifiant le mot QUICK (DELETE QUICK FROM ...). Cela permet de réutiliser les valeurs des index effacées.
* TRUNCATE efface également les lignes rapidement, en faisant DROP et CREATE (sur certains moteurs de stockage seulement).
* TRUNCATE ne garantit pas la transaction ou le verrouillage.
* DELETE informe de combien de lignes ont été supprimées, mais pas TRUNCATE.
* Après une suppression massive (au moins 30 % des lignes), il convient de lancer OPTIMIZE TABLE juste après pour accélérer la suite.
* Sur des tables InnoDB avec contraintes FOREIGN KEY, TRUNCATE se comporte comme DELETE.
Il est possible de classer les lignes avant leur suppression, tout en en choisissant le nombre.
Pour supprimer des enregistrements de plusieurs tables (multi-table delete ou cross table delete) :
Toutefois dans les version inférieures à la 4 (et étonnamment constaté comme fausse alerte par PhpMyAdmin sur des versions ultérieures), les jointures sont interdites dans les suppressions, et on doit alors utiliser le WHERE :
Comme la clause LIMIT ne fonctionne pas sur les suppressions multiples, il faut contourner en supprimant les enregistrements retournés par un SELECT avec LIMIT.

## Références

* ↑ https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html
* ↑ http://dev.mysql.com/doc/refman/5.5/en/replace.html
* ↑ https://dev.mysql.com/doc/refman/5.7/en/delete.html
* ↑ https://www.electrictoolbox.com/article/mysql/cross-table-delete/