# MySQL/Manipulation de table

* 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 ]

## CREATE TABLE

La syntaxe de création des tables d'une base est ainsi :
Les bonnes pratiques du nommage des tables sont les mêmes que pour les colonnes, et consistent à évier les mots réservés, les abréviations, et n'utiliser que des minuscules en snake case.

### Création à partir d'une autre table

Les enregistrements de la requête SELECT peuvent être enregistrés dans une nouvelle table. Les types des données seront les mêmes que dans l'ancienne table. Exemple :

### Auto-incrémentation

De plus, MySQL peut assurer l'auto-incrémentation des clés uniques grâce à l'option AUTO_INCREMENT. En cas de troncature de la table, le compteur peut être réinitialiser avec :

### Moteurs

Le moteur de stockage d'une table est défini par la clause ENGINE=. On en distingue deux principaux :
* MyISAM : light.
* InnoDB : gère les transactions (commit / rollback) et les clés étrangères.

#### Tables d'archive

MySQL propose un type de table d'archive, prenant moins de place (par compression) mais dont on ne peut pas supprimer les enregistrements une fois ajoutés :

### Tables temporaires

Il est possible de créer des variables de type table, qui seront effacées à la fin de leurs scripts. On les appelle "tables temporaires" :
Exemple avec paramètre nommé :
Si le nom de la colonne ne correspond pas au nom du champ sélectionné, la table temporaire se voit ajouter une colonne du nom de ce champ. Ex :
Toutes les tables temporaires sont supprimées à la fin de la connexion MySQL qui les a créée.

### Copier une table

Pour obtenir la même structure (noms et types des champs, index, mais aucun enregistrement) :
Pour dupliquer le contenu d'une table dans le résultat :
Pour avoir le code de création :

## ALTER TABLE

ALTER TABLE sert à ajouter, supprimer ou modifier la structure des tables (colonnes, index, propriétés).

### Modifier une colonne

Pour changer les caractéristiques :

#### Renommer une colonne

Pour renommer une colonne :

### Renommer une table

Pour renommer une table, il faut préalablement retirer ses privilèges avec ALTER et DROP, puis CREATE et INSERT pour ceux à attribuer à la nouvelle table.
La différence entre ALTER TABLE et RENAME est que seul le premier peut renommer les tables temporaires, mais il n'en permet qu'un par requête.

## CASCADE

Certains enregistrements d'une base de données relationnelle peuvent devenir inutiles si ceux qui leur sont joints viennent à disparaitre.
C'est par exemple le cas dans une table "adresse de facturation" où il n'y n'aurait plus de personne physique ou morale associée, c'est-à-dire qu'il existerait en mémoire une ligne avec un id utilisateur pointant vers une ligne de la table "utilisateur" qui n'existe plus.
Pour éviter d'avoir à maintenir ces reliquats, MySQL offre la possibilité de les supprimer automatiquement "en cascade", au moment où ceux qui leur sont joints sont effacés. Cela se définit par dessus la contrainte d'intégrité FOREIGN KEY.
Exemple :

## Unique

Une autre contrainte d'intégrité qui permet de forcer chaque valeur d'un champ à être différentes est UNIQUE :
Pour ajouter une contrainte unique du nom de la colonne concernée :
Pour ajouter une contrainte unique nommée :
La différence entre les deux est la requête utilisée pour l'ajouter.
Pour un groupe de champs unique (clé composite) :
L'index unique est déjà un index, donc inutile d'ajouter ADD INDEX sur le même champ de même type en plus.

## Exemple pour travaux pratiques

Soit l'exemple suivant qui sera utilisé pour les sélections ensuite (toute ressemblance avec un framework connu est purement non fortuite : si vous avez déjà votre propre wiki, il est possible de sauter cette phase pour passer directement au paragraphe SELECT).
NB : le type VARBINARY est équivalent à VARCHAR, mais il faut savoir qu'il stocke la chaine de caractères sous sa forme binaire, et donc prend moins de place.
Création d'une base

## Références

* ↑ https://sql.sh/1396-nom-table-colonne
* ↑ http://www.mysqltutorial.org/mysql-temporary-table/
* ↑ http://dev.mysql.com/doc/refman/5.7/en/table-size-limit.html
* ↑ https://board.phpbuilder.com/d/10271323-phppgadmin-add-unique-index-vs-add-unique-key
* ↑ https://stackoverflow.com/questions/9393234/mysql-unique-field-needs-to-be-an-index