Créer sa première base et ses tables — CREATE TABLE
Types de colonnes (INT, VARCHAR, TEXT, DECIMAL, DATETIME, BOOLEAN, ENUM, JSON). Contraintes (PK, AUTO_INCREMENT, NOT NULL, DEFAULT, UNIQUE, CHECK, UNSIGNED). Conventions de nommage Laravel. Tables categories + products.
Concepts Théoriques
Une table est le conteneur fondamental d'une base de données. Avant de stocker un seul produit ou un seul client, vous devez définir la structure : quelles colonnes existent, quel type de données chacune accepte, et quelles règles s'appliquent. C'est comme concevoir un formulaire papier — vous décidez quels champs existent, si un champ est obligatoire, et quel format il attend.
CREATE TABLE — la syntaxe
La structure de base :
CREATE TABLE nom_table ( nom_colonne TYPE CONTRAINTES, nom_colonne TYPE CONTRAINTES );
Chaque colonne a trois éléments : un nom (descriptif, en snake_case), un type (quel genre de données elle stocke), et des contraintes optionnelles (obligatoire ? unique ? valeur par défaut ?).
Les types de colonnes — choisir le bon
Choisir le bon type n'est pas cosmétique — un mauvais type gaspille de l'espace disque, ralentit les requêtes, ou provoque des erreurs de calcul.
Nombres entiers
- INT — nombre entier standard, de -2 147 483 648 à +2 147 483 647. C'est le type par défaut pour les id, les quantités, les compteurs. Avec UNSIGNED (positif seulement), il va de 0 à 4 294 967 295.
- BIGINT — entier très large (jusqu'à 9.2 × 10¹⁸). Utilisez-le seulement si vos id dépasseront 4 milliards (cas rare — réseaux sociaux, IoT).
- TINYINT — petit entier de -128 à 127 (ou 0 à 255 en UNSIGNED). MySQL l'utilise comme BOOLEAN : TINYINT(1) où 0 = false et 1 = true.
- SMALLINT — entier moyen de -32 768 à 32 767. Pour les notes (1-5), les âges, les codes courts.
Nombres décimaux
- DECIMAL(M, D) — nombre exact avec M chiffres au total dont D après la virgule. DECIMAL(10, 2) stocke jusqu'à 99 999 999.99. TOUJOURS utiliser DECIMAL pour l'argent — jamais FLOAT ni DOUBLE. Ces derniers sont des approximations (0.1 + 0.2 = 0.30000000000000004), et une erreur d'arrondi de 1 FCFA sur 10 000 transactions fait 10 000 FCFA de différence.
- FLOAT / DOUBLE — nombres à virgule flottante, rapides mais imprécis. Utilisez-les pour les coordonnées GPS, les mesures scientifiques, les pourcentages — jamais pour l'argent.
Texte
- VARCHAR(n) — texte de longueur variable avec un maximum de n caractères. C'est le type le plus courant : noms (100), emails (255), slugs (255), URLs (500). Il n'occupe QUE l'espace nécessaire — un VARCHAR(255) qui contient "Dakar" ne prend que 5 caractères + 1 octet de taille.
- TEXT — texte long sans limite pratique (~65 000 caractères). Pour les descriptions de produits, les commentaires, les articles de blog. Plus lent à indexer que VARCHAR.
- CHAR(n) — texte de longueur FIXE, toujours n caractères. Utilisez-le pour les codes standards : CHAR(2) pour les pays ("SN"), CHAR(3) pour les devises ("XOF"), CHAR(5) pour les codes postaux. MySQL padde avec des espaces si la valeur est plus courte.
- ENUM('val1', 'val2', 'val3') — une valeur parmi une liste prédéfinie. Pour les statuts de commande ('pending', 'confirmed', 'shipped', 'delivered', 'cancelled'), les rôles utilisateur ('admin', 'user'). Plus rapide et plus sûr qu'un VARCHAR libre.
Dates et heures
- DATE — date seule au format AAAA-MM-JJ (2026-03-24). Pour les dates de naissance, les dates d'expiration.
- DATETIME — date et heure au format AAAA-MM-JJ HH:MM:SS (2026-03-24 14:30:00). Pour les horodatages de commandes, inscriptions, modifications.
- TIMESTAMP — similaire à DATETIME mais avec un comportement spécial : il se met à jour automatiquement avec DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP. Idéal pour les colonnes created_at et updated_at.
- TIME — heure seule (14:30:00). Rarement utilisé seul.
Booléen
- BOOLEAN — vrai ou faux. En MySQL, c'est un alias pour TINYINT(1). On insère 1 (true) ou 0 (false), et on teste avec WHERE is_active = TRUE (qui est traduit en WHERE is_active = 1).
JSON
- JSON — stocke des données structurées (tableaux, objets) sous forme de texte JSON. MySQL peut indexer et rechercher dans les champs JSON. Utile pour les métadonnées flexibles (attributs de produit, préférences utilisateur), mais n'en abusez pas — si la donnée a une structure fixe, une colonne dédiée est meilleure.
Les contraintes — les règles de la table
Les contraintes sont des règles que MySQL applique automatiquement. Elles protègent l'intégrité de vos données.
- PRIMARY KEY — identifiant unique de chaque ligne. Obligatoire sur chaque table. Deux lignes ne peuvent jamais avoir le même id. Généralement un INT AUTO_INCREMENT.
- AUTO_INCREMENT — MySQL attribue automatiquement le prochain numéro (1, 2, 3...). Toujours combiné avec PRIMARY KEY. Vous n'insérez jamais cette valeur manuellement.
- NOT NULL — la colonne ne peut pas être vide. Le nom d'un produit est obligatoire, son image ne l'est pas. Par défaut, les colonnes acceptent NULL.
- DEFAULT valeur — valeur automatique si aucune n'est spécifiée lors de l'insertion. stock DEFAULT 0, is_active DEFAULT TRUE, created_at DEFAULT CURRENT_TIMESTAMP.
- UNIQUE — la valeur doit être unique dans toute la table. L'email d'un client, le slug d'un produit. Tenter d'insérer un doublon déclenche une erreur.
- CHECK (condition) — vérifie une condition : CHECK (rating BETWEEN 1 AND 5), CHECK (price >= 0). MySQL 8.0+ supporte CHECK.
- UNSIGNED — seulement des nombres positifs (0 et plus). Un prix, une quantité, un id ne peuvent pas être négatifs — UNSIGNED empêche les valeurs négatives et double la plage positive.
Conventions de nommage — les standards de l'industrie
Les conventions ne sont pas obligatoires mais les respecter rend votre code lisible par tout développeur :
- Tables au pluriel, en snake_case : products, order_items, customer_addresses
- Colonnes en snake_case : first_name, unit_price, created_at, is_active
- La clé primaire s'appelle toujours id
- Les clés étrangères suivent le pattern table_singulier_id : category_id, customer_id, order_id
- Les booléens commencent par is_ ou has_ : is_active, is_featured, has_discount
- Les dates se terminent par _at ou _date : created_at, updated_at, expires_at, birth_date
Ces conventions sont celles de Laravel/Eloquent — les suivre maintenant vous facilitera la vie plus tard.