🗄️ Introduction à MySQL
MySQL est le système de gestion de bases de données relationnelles (SGBDR) open-source le plus utilisé au monde. Il organise les données en tables liées par des clés étrangères.
Architecture
- Serveur MySQL : processus qui gère les données (port 3306 par défaut)
- Client : CLI (
mysql), MySQL Workbench, phpMyAdmin, XAMPP - Base de données : collection de tables logiquement liées
MySQL 8.0+ est la version recommandée. Elle supporte les CTE, les fonctions de fenêtrage, et le mode strict par défaut.
Démarrer
-- Se connecter via CLI
mysql -u root -p
-- Commandes de base
SHOW DATABASES;
CREATE DATABASE IF NOT EXISTS formation_mysql;
USE formation_mysql;
SHOW TABLES;
📋 Types de données
Choisir le bon type pour chaque colonne est essentiel pour la performance et l'intégrité des données.
Types numériques
| Type | Plage | Usage |
|---|---|---|
TINYINT | -128 à 127 (ou 0–255 UNSIGNED) | Age, note sur 100 |
SMALLINT | -32 768 à 32 767 | Année, code postal |
INT | ±2 milliards | ID, compteur |
BIGINT | ±9 × 10¹⁸ | ID grande échelle |
DECIMAL(p,s) | Précision exacte | Montants, prix |
FLOAT / DOUBLE | Approché | Calculs scientifiques |
Utilisez toujours
DECIMAL pour les montants financiers. FLOAT introduit des erreurs d'arrondi binaires (0.1 + 0.2 ≠ 0.3 exactement).Types chaîne
CHAR(10) -- longueur fixe, toujours 10 octets (complété d'espaces)
VARCHAR(255) -- longueur variable, jusqu'à 255 caractères
TEXT -- texte long sans limite pratique
MEDIUMTEXT -- jusqu'à 16 Mo
LONGTEXT -- jusqu'à 4 Go
Types date et heure
DATE -- 'YYYY-MM-DD' ex: '2024-01-15'
TIME -- 'HH:MM:SS' ex: '10:30:00'
DATETIME -- 'YYYY-MM-DD HH:MM:SS' ex: '2024-01-15 10:30:00'
TIMESTAMP -- Stocké en UTC, converti selon fuseau horaire
YEAR -- 1901 à 2155
Autres types courants
BOOLEAN -- alias de TINYINT(1) : 0 = false, 1 = true
ENUM('a','b') -- liste de valeurs prédéfinies
JSON -- JSON natif (MySQL 5.7.8+)
🏗️ CREATE TABLE
La syntaxe de création de table inclut les colonnes, les types, et les contraintes.
-- Toujours précéder d'un DROP pour les scripts idempotents
DROP TABLE IF EXISTS produits;
CREATE TABLE produits (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
nom VARCHAR(200) NOT NULL,
prix DECIMAL(10, 2) NOT NULL,
stock INT NOT NULL DEFAULT 0,
categorie_id INT UNSIGNED NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
CONSTRAINT fk_produits_categories
FOREIGN KEY (categorie_id)
REFERENCES categories(id)
ON DELETE SET NULL
ON UPDATE CASCADE
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
Utilisez toujours
ENGINE=InnoDB : il supporte les transactions, les clés étrangères et le verrouillage au niveau des lignes. MyISAM (ancien moteur) ne supporte aucune de ces fonctionnalités.Afficher la structure
-- Structure résumée
DESCRIBE produits;
-- DDL complet (colonnes + index + FK)
SHOW CREATE TABLE produits;
🔒 Contraintes d'intégrité
PRIMARY KEY
Identifie chaque ligne de façon unique. Combine UNIQUE + NOT NULL. MySQL crée automatiquement un index sur la PK.
FOREIGN KEY
FOREIGN KEY (col) REFERENCES autre_table(col)
ON DELETE CASCADE -- supprime les lignes liées
ON DELETE RESTRICT -- interdit la suppression si des lignes existent
ON DELETE SET NULL -- met la FK à NULL
ON UPDATE CASCADE -- propage la mise à jour
UNIQUE
-- Colonne unique
email VARCHAR(200) UNIQUE,
-- Contrainte composite unique
UNIQUE KEY uniq_nom_ville (nom, ville)
CHECK (MySQL 8.0.16+)
prix DECIMAL(10,2) NOT NULL,
CONSTRAINT chk_prix_positif CHECK (prix >= 0)
DEFAULT
stock INT NOT NULL DEFAULT 0,
statut VARCHAR(20) DEFAULT 'actif',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
📥 Premières données
-- INSERT simple
INSERT INTO categories (nom, description)
VALUES ('Electronique', 'Appareils et accessoires high-tech');
-- INSERT multi-lignes (plus efficace)
INSERT INTO produits (nom, prix, stock, categorie_id) VALUES
('Smartphone Pro 14', 899.00, 50, 1),
('Laptop UltraBook', 1299.00, 20, 1),
('Casque Bluetooth', 149.00, 80, 1);
-- Vérification
SELECT * FROM produits;
SELECT COUNT(*) AS total FROM produits;
Respectez l'ordre d'insertion : insérez d'abord les tables parentes (sans FK) avant les tables enfants. Ex:
categories avant produits.