Accueil › Cours › Bases de données : créer les tables
Bases de données MySQL : créer les tables, clés et contraintes
Organise des données en tables reliées : champs, types, clé primaire, clé étrangère, contraintes, puis remplis et modifie les tables en SQL.
Les leçons de ce chapitre
- Tables, champs et types
- Clés étrangères et contraintes
- Remplir et modifier une table
Leçon 27.1 : Tables, champs et types
Une base de données range des informations dans des tables. Une table ressemble à un tableau : chaque colonne est un champ (nom, prénom, moyenne…) et chaque ligne est un enregistrement (un élève).
La clé primaire
La clé primaire est le champ qui identifie chaque ligne : deux lignes n'ont jamais la même valeur, et elle n'est jamais vide. Dans le schéma d'une table, on la souligne (ici en gras) : eleve (id, nom, prenom, moyenne).
Les types de MySQL
INT: un entier (âge, quantité).DECIMAL(5,2): un nombre à virgule, 5 chiffres dont 2 après la virgule (123.45).VARCHAR(30): un texte de 30 caractères au plus.CHAR(8): exactement 8 caractères.TEXT: un long texte.DATE: une date écrite'2026-10-09'(année-mois-jour).TIME: une heure'14:30:00'.DATETIME: les deux.
Créer la base et une table
CREATE DATABASE ecole;
USE ecole;
CREATE TABLE eleve (
id INT PRIMARY KEY,
nom VARCHAR(30) NOT NULL,
prenom VARCHAR(30) NOT NULL,
moyenne DECIMAL(4,2)
);
NOT NULL oblige à remplir le champ. La commande DESCRIBE eleve; affiche la structure de la table : ses champs, leurs types, la clé.
Attention : Une virgule sépare les champs, mais il n'y en a pas après le dernier. Et VARCHAR a toujours sa taille : VARCHAR(30), jamais VARCHAR seul.
En SQL
Exécute le script et lis le résultat de DESCRIBE. Puis ajoute un champ ville VARCHAR(20) à la table et exécute de nouveau.
CREATE DATABASE ecole;
USE ecole;
CREATE TABLE eleve (
id INT PRIMARY KEY,
nom VARCHAR(30) NOT NULL,
prenom VARCHAR(30) NOT NULL,
moyenne DECIMAL(4,2)
);
DESCRIBE eleve;
Leçon 27.2 : Clés étrangères et contraintes
Les tables d'une base sont reliées. Une classe a plusieurs élèves, un élève est dans une seule classe : c'est une relation un à plusieurs (1:n). On la représente par une clé étrangère : la table eleve garde le code de sa classe.
Dans le schéma, la clé étrangère est précédée de # : classe (code, niveau) et eleve (id, nom, #code_classe).
CREATE TABLE classe (
code VARCHAR(5) PRIMARY KEY,
niveau VARCHAR(20) NOT NULL
);
CREATE TABLE eleve (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(30) NOT NULL,
code_classe VARCHAR(5),
FOREIGN KEY (code_classe) REFERENCES classe(code)
);
Les contraintes d'intégrité
- Entité : la clé primaire est unique et jamais vide.
- Domaine : chaque valeur respecte son type et ses règles :
NOT NULL,UNIQUE(pas de doublon),DEFAULT 'Tunis'(valeur si on ne donne rien),CHECK (moyenne BETWEEN 0 AND 20). - Référentielle : une clé étrangère contient une valeur qui existe dans l'autre table. MySQL refuse un élève d'une classe inconnue (erreur #1452), et refuse de supprimer une classe qui a encore des élèves (#1451).
Astuce : AUTO_INCREMENT numérote tout seul : à l'insertion, on ne donne pas l'id, MySQL met 1, 2, 3…
Une relation plusieurs à plusieurs (n:m), par exemple des élèves inscrits à plusieurs clubs, se fait avec une table de plus qui contient les deux clés étrangères ; sa clé primaire est faite des deux champs : PRIMARY KEY (id_eleve, code_club).
En SQL
Exécute le script. Puis enlève les -- devant la dernière ligne et exécute de nouveau : cet INSERT est refusé (erreur #1452), car la classe 9Z n'existe pas.
CREATE TABLE classe (
code VARCHAR(5) PRIMARY KEY,
niveau VARCHAR(20) NOT NULL
);
CREATE TABLE eleve (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(30) NOT NULL,
code_classe VARCHAR(5),
FOREIGN KEY (code_classe) REFERENCES classe(code)
);
INSERT INTO classe VALUES ('3SI1', '3ème SI');
INSERT INTO eleve (nom, code_classe) VALUES ('Trabelsi', '3SI1');
SELECT * FROM eleve;
-- INSERT INTO eleve (nom, code_classe) VALUES ('Jaziri', '9Z');
Leçon 27.3 : Remplir et modifier une table
Insérer des lignes : INSERT INTO
INSERT INTO eleve VALUES (1, 'Ben Salah', 'Amine', 12.50);
INSERT INTO eleve (id, nom, prenom) VALUES (2, 'Trabelsi', 'Sarra');
INSERT INTO eleve (id, nom, prenom, moyenne) VALUES
(3, 'Jaziri', 'Yassine', 9.75),
(4, 'Mansour', 'Rim', 14.00);
- Sans liste de champs, on donne toutes les valeurs, dans l'ordre de la table.
- Avec une liste, les champs oubliés reçoivent leur valeur
DEFAULT, ouNULL. - Les textes et les dates sont entre apostrophes :
'Sousse','2009-03-15'. Les nombres non, et la virgule décimale est un point :12.5.
Modifier la structure : ALTER TABLE
ALTER TABLE eleve ADD tel VARCHAR(8);
ALTER TABLE eleve MODIFY nom VARCHAR(40) NOT NULL;
ALTER TABLE eleve DROP COLUMN tel;
ADD ajoute un champ, MODIFY change son type ou ses règles, DROP COLUMN le supprime. DROP TABLE eleve; supprime toute la table, avec ses lignes.
Attention : Une date s'écrit toujours 'AAAA-MM-JJ' : '15/06/2009' est refusé (erreur #1292).
En SQL
Exécute, puis ajoute un cinquième élève avec un seul INSERT et regarde le résultat du SELECT.
CREATE TABLE eleve (
id INT PRIMARY KEY,
nom VARCHAR(30) NOT NULL,
prenom VARCHAR(30) NOT NULL,
moyenne DECIMAL(4,2)
);
INSERT INTO eleve VALUES (1, 'Ben Salah', 'Amine', 12.50);
INSERT INTO eleve (id, nom, prenom) VALUES (2, 'Trabelsi', 'Sarra');
ALTER TABLE eleve ADD ville VARCHAR(20) DEFAULT 'Tunis';
SELECT * FROM eleve;
S'entraîner gratuitement
Chaque leçon a 3 exercices gratuits avec indices pour appliquer ce chapitre avec Hannibot.
← Chapitre précédent : JavaScript et la page · Chapitre suivant : Requêtes SQL simples →
Tous les chapitres · Voir les devoirs corrigés de 2ème TI
Cours écrit pour Mission Carthage d'après le programme officiel. Ton professeur reste la référence.