Construire une base de données dans MySQL
Créer et supprimer une base de données
L’ordre SQL CREATE DATABASE permet de créer une nouvelle base de données.
Syntaxe simplifiée
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] nom_base
nom_base est le nom de la nouvelle base de données. Ce nom doit respecter les règles de nommage des objets MySQL.
CREATE SCHEMA est un synonyme de CREATE DATABASE.
Une erreur se produit si une base de données de même nom existe déjà et que la clause IF NOT EXISTS n’est pas présente.
Pour créer une base de données, il faut le privilège global CREATE.
Physiquement, une base de données MySQL se matérialise par un répertoire qui contiendra les fichiers correspondant aux différentes tables de la base de données.
L’ordre SQL CREATE DATABASE propose plusieurs options qui permettent de spécifier le jeu de caractères et la collation par défaut de la base de données, ou de chiffrer la base de données (depuis la version 8.0.16).
Exemple
mysql> CREATE DATABASE biblio;
Query OK, 1 row affected (0.00 sec)
L’ordre SQL DROP DATABASE permet de supprimer une base de données.
Syntaxe
DROP {DATABASE | SCHEMA} [IF EXISTS] nom_base
DROP SCHEMA est un synonyme de DROP DATABASE.
Une erreur se produit si la base de données n’existe pas et que la clause IF EXISTS n’est pas présente.
Pour supprimer une base de données, il faut le privilège global DROP.
L’ordre DROP DATABASE supprime tout, sans demander de confirmation. Il faut y réfléchir à deux fois avant d’exécuter cette commande !
Gérer les utilisateurs et les droits
1. Vue d’ensemble
Lors de l’installation de MySQL, un compte super-utilisateur nommé root est automatiquement créé.
Le compte root est normalement réservé à l’administration du serveur MySQL.
En complément du compte root, il est donc conseillé de créer au minimum un compte par application et éventuellement un compte par utilisateur final de l’application. De cette manière, il sera possible de gérer très finement les droits attribués à chaque utilisateur/application et de limiter les risques liés à l’utilisation du compte root.
Dans MySQL, un utilisateur est identifié de manière unique par la combinaison de deux informations :
-
un nom d’utilisateur ;
-
un nom d’hôte (ou adresse IP) à partir duquel l’utilisateur peut se connecter.
Chaque couple utilisateur/hôte est considéré par MySQL comme un utilisateur unique qui a un mot de passe pour se connecter (éventuellement aucun) et des droits. Un même utilisateur (au sens d’un nom d’utilisateur donné) peut donc avoir des droits différents selon l’hôte à partir duquel il se connecte.
La syntaxe utilisée pour désigner un utilisateur est donc la suivante :
nom_utilisateur[@nom_hôte]
Pour le nom d’hôte, la valeur ’%’ signifie "n’importe quel hôte" ; c’est la valeur par défaut utilisée lorsque le nom d’hôte n’est pas spécifié. Le caractère % peut aussi être utilisé comme caractère joker dans le nom d’hôte ou l’adresse IP pour spécifier une liste de machine (oheurtel@’%.olivier-heurtel.fr’) ou une plage d’adresses...
Gérer les tables
1. Créer une table
L’ordre SQL CREATE TABLE permet de créer une nouvelle table.
Syntaxe simplifiée
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nom_table
(spécification_colonne,
...
)
[ENGINE|TYPE[=] moteur]
spécification_colonne =
nom_colonne type_colonne [option_colonne]
option_colonne (première possibilité) =
[NOT NULL | NULL] [VISIBLE | INVISIBLE] [DEFAULT valeur] | (expression)]
[AUTO_INCREMENT] [[PRIMARY] KEY] [UNIQUE [KEY]]
option_colonne (deuxième possibilité) =
[GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED]
[NOT NULL | NULL] [VISIBLE | INVISIBLE] [[PRIMARY] KEY] [UNIQUE [KEY]]
Exemple simple
mysql> CREATE TABLE evenement
-> (
-> id INT,
-> nom VARCHAR(20)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> DESC evenement;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| nom | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
Le nom de la nouvelle table doit respecter les règles...
Utiliser les contraintes et les index
1. Clé primaire ou unique
a. Définition
Une clé primaire (ou contrainte de clé primaire) garantit qu’il n’y aura jamais deux lignes dans la table qui auront la même valeur dans la(les) colonne(s) qui compose(nt) la clé. Par ailleurs, toutes les colonnes de la clé primaire sont obligatoires (clause NOT NULL implicite pour les colonnes concernées).
Une seule clé primaire est autorisée par table.
Une clé unique (ou contrainte de clé unique) garantit qu’il n’y aura jamais deux lignes dans la table qui auront la même valeur dans la(les) colonne(s) qui compose(nt) la clé. À la différence de la clé primaire, les colonnes qui composent la clé unique ne sont pas forcément obligatoires ; pour les colonnes de la clé qui ne sont pas obligatoires, plusieurs lignes peuvent avoir la valeur NULL sans violer la contrainte. Plusieurs clés uniques sont autorisées par table.
Une clé primaire ou unique peut être constituée d’une seule colonne ou de plusieurs colonnes.
Lors d’une insertion ou d’une modification, une erreur se produit si une clé (primaire ou unique) contient une valeur qui existe déjà dans la table.
Les clés primaires et uniques sont des index particuliers qui imposent une contrainte d’unicité. Un accès par une clé primaire ou unique est donc performant.
b. Gestion
Une clé primaire ou unique constituée d’une seule colonne peut être définie directement dans les options de la colonne, lors du CREATE TABLE, ou lors d’un ALTER TABLE ... {CHANGE|MODIFY} (voir la syntaxe de ces différents ordres dans les sections précédentes).
Sinon, d’une manière plus générale, une clé...
Utiliser des vues
1. Définition
Une vue est une requête SELECT dont la définition est stockée avec un nom dans la base de données.
La vue ne stocke pas de données ; les données présentées par la vue sont dérivées des tables interrogées par la requête de la vue.
Une vue s’utilise comme une table. Certaines vues peuvent être utilisées dans des ordres de mise à jour (INSERT, UPDATE, DELETE) pour modifier les données des tables sous-jacentes. Pour qu’une vue puisse être utilisée en mise à jour, il faut qu’il y ait une relation un-un entre les lignes retournées par la vue et les lignes de la table sous-jacente. Une vue ne peut pas être utilisée en mise à jour si la requête qui la définit contient notamment une des constructions suivantes :
-
Une clause DISTINCT.
-
Des expressions dans la clause SELECT (interdit les ordres INSERT mais pas les ordres UPDATE qui modifient uniquement les colonnes qui ne sont pas calculées).
-
Des agrégats, des unions, des sous-requêtes dans la clause SELECT (cf. chapitre Techniques avancées avec MySQL - Utiliser des sous-requêtes).
Les vues sont utilisées principalement pour :
-
Faciliter l’accès aux données : la requête utilisée pour définir la vue peut être complexe et comporter par exemple des jointures entre plusieurs tables. Les requêtes qui utilisent la vue sont alors plus simples à écrire.
-
Sécuriser l’accès aux données : la requête utilisée pour définir la vue peut masquer des colonnes (colonnes non sélectionnées dans la clause SELECT) et/ou des lignes (clause WHERE qui filtre les données). En matière de gestion de droit, il est possible de donner un droit de lecture...
Obtenir des informations sur les bases de données
1. La commande SHOW
La commande SHOW propose de nombreuses variantes qui permettent d’afficher des informations sur les bases de données, les tables, les vues, etc.
Variante 1 : afficher une liste d’objets
SHOW TABLES [FROM nom_base] [condition]
SHOW DATABASES [condition]
SHOW TRIGGERS [FROM nom_base] [condition]
Variante 2 : afficher la liste des colonnes ou des index d’une table
SHOW COLUMNS FROM nom_table [FROM nom_base] [condition]
SHOW INDEX FROM nom_table [FROM nom_base]
Variante 3 : afficher l’ordre de création d’un objet
SHOW CREATE {DATABASE | SCHEMA} nom_base
SHOW CREATE FUNCTION nom_fonction
SHOW CREATE PROCEDURE nom_procédure
SHOW CREATE TABLE nom_table
SHOW CREATE TRIGGER nom_trigger
SHOW CREATE VIEW nom_vue
Variante 4 : afficher une liste d’objets avec quelques caractéristiques
SHOW PROCEDURE STATUS [condition]
SHOW FUNCTION STATUS [condition]
SHOW TABLE STATUS [FROM nom_base] [condition]
Avec :
condition = LIKE 'modèle' | WHERE expression
Le résultat de la commande SHOW est affiché sous la forme de lignes et de colonnes, comme le résultat d’une requête SELECT. La plupart des langages qui accèdent à MySQL permettent de traiter le résultat de la commande SHOW de la même manière que le résultat d’une requête SELECT.
La clause optionnelle condition permet de filtrer le résultat de la commande SHOW, soit à l’aide d’une expression LIKE qui s’applique implicitement au nom de l’objet, soit à l’aide d’une clause WHERE qui peut s’appliquer à n’importe quelle colonne du résultat.
Exemple
mysql> SHOW COLUMNS FROM collection;
+----------+--------------+------+-----+---------+----------------+
| Field |...
Exporter et importer une base de données
L’application cliente mysqldump permet d’exporter une base de données MySQL, sous la forme d’un fichier ("dump") contenant les ordres permettant de recréer la base de données. C’est un des moyens qui peut être utilisé pour sauvegarder une base de données.
Syntaxe simplifiée
mysqldump [-h hôte] [-u utilisateur] [-p[mot_de_passe]] nom_base
Avec :
-h hôte |
Hôte auquel il faut se connecter (machine locale par défaut). |
-u utilisateur |
Nom d’utilisateur pour la connexion (nom de l’utilisateur courant du système d’exploitation par défaut). |
-p[mot_de_passe] |
Mot de passe pour la connexion (aucun mot de passe par défaut). S’il n’est pas donné sur la ligne de commande, il sera demandé de manière interactive, en saisie masquée. Si le mot de passe est spécifié dans la ligne de commande (ce qui n’est pas conseillé pour la sécurité), il ne doit pas y avoir d’espace après l’option -p. |
nom_base |
Nom de la base de données à exporter. |
mysqldump affiche le résultat sur la sortie standard ; pour récupérer ce résultat dans un fichier, il faut utiliser une commande de redirection (> fichier).
Exemple
[root@xampp ~]# mysqldump -u root eni > dump-base-eni.sql
Résultat (extraits du fichier dump-base-eni.sql)
-- MySQL dump 10.13 Distrib 8.0.28, for Linux (x86_64)
--
-- Host: localhost Database: eni
-- ------------------------------------------------------
-- Server version 8.0.28
...
--
-- Table structure for table `rubrique`
--
DROP TABLE IF EXISTS `rubrique`;
/*!40101 SET @saved_cs_client...