CREATE TABLE – Créer une table
Bonne lecture et bon apprentissage !
Junior TSAFACK – 08/08/2026
⏱️ Temps de lecture estimé : 6 minutes
La commande CREATE TABLE permet de créer une table en SQL. Un tableau est une entité qui est contenu dans une base de données pour stocker des données ordonnées dans des colonnes. La création d’une table sert à définir les colonnes et le type de données qui seront contenus dans chacune des colonnes (entier, chaîne de caractères, date, valeur binaire, etc.).
Syntaxe
Section titled “Syntaxe”La syntaxe générale pour créer une table est la suivante :
CREATE TABLE nom_de_la_table ( colonne1 type_donnees [contraintes], colonne2 type_donnees [contraintes], colonne3 type_donnees [contraintes], colonne4 type_donnees [contraintes]);Dans cette requête, les colonnes sont définies avec leur nom, leur type de données et éventuellement des contraintes.
Types de données courants
Section titled “Types de données courants”| Type de données | Description | Exemple |
|---|---|---|
INT |
Nombres entiers | 42, -15, 0 |
BIGINT |
Nombres entiers grands | 99999999999 |
VARCHAR(n) |
Chaîne de caractères de longueur variable (max n) | ‘Bonjour’ |
TEXT |
Chaîne de caractères longue | ‘Un long texte…’ |
DATE |
Date (AAAA-MM-JJ) | ‘2024-01-15’ |
DATETIME |
Date et heure | ‘2024-01-15 14:30:00’ |
TIMESTAMP |
Horodatage (date et heure) | ‘2024-01-15 14:30:00’ |
DECIMAL(p,s) |
Nombre décimal (p chiffres, s décimales) | 99.99 |
FLOAT |
Nombre à virgule flottante | 3.14159 |
BOOLEAN |
Valeur booléenne (VRAI/FAUX) | TRUE / FALSE |
BLOB |
Données binaires (images, fichiers) | (données binaires) |
Bon à savoir : Les types de données peuvent varier légèrement selon le SGBD. Consultez la documentation de votre SGBD pour connaître les types disponibles.
Contraintes
Section titled “Contraintes”Il est également possible de définir des contraintes pour chaque colonne :
| Contrainte | Description |
|---|---|
NOT NULL |
Empêche d’enregistrer une valeur nulle |
DEFAULT |
Attribuer une valeur par défaut |
PRIMARY KEY |
Définit la clé primaire (unique et non nulle) |
UNIQUE |
Garantit l’unicité des valeurs |
CHECK |
Valide une condition sur la valeur |
FOREIGN KEY |
Définit une clé étrangère (référence à une autre table) |
Exemple concret
Section titled “Exemple concret”Imaginons que l’on souhaite créer une table utilisateur, dans laquelle chaque ligne correspond à un utilisateur inscrit sur un site web.
CREATE TABLE utilisateur ( id INT PRIMARY KEY NOT NULL, nom VARCHAR(100), prenom VARCHAR(100), email VARCHAR(255), date_naissance DATE, pays VARCHAR(255), ville VARCHAR(255), code_postal VARCHAR(5), nombre_achat INT DEFAULT 0);Explications détaillées des colonnes :
| Colonne | Type | Contrainte | Description |
|---|---|---|---|
id |
INT |
PRIMARY KEY, NOT NULL |
Identifiant unique (clé primaire) |
nom |
VARCHAR(100) |
- | Nom de l’utilisateur (100 caractères max) |
prenom |
VARCHAR(100) |
- | Prénom de l’utilisateur |
email |
VARCHAR(255) |
- | Adresse email (255 caractères max) |
date_naissance |
DATE |
- | Date de naissance |
pays |
VARCHAR(255) |
- | Pays de résidence |
ville |
VARCHAR(255) |
- | Ville de résidence |
code_postal |
VARCHAR(5) |
- | Code postal (5 caractères) |
nombre_achat |
INT |
DEFAULT 0 |
Nombre d’achats (0 par défaut) |
Ajouter des contraintes avancées
Section titled “Ajouter des contraintes avancées”CHECK (validation)
Section titled “CHECK (validation)”Pour s’assurer que l’âge est positif :
CREATE TABLE personne ( id INT PRIMARY KEY, nom VARCHAR(100), age INT CHECK (age >= 0));UNIQUE
Section titled “UNIQUE”Pour garantir qu’un email n’est pas utilisé deux fois :
CREATE TABLE utilisateur ( id INT PRIMARY KEY, email VARCHAR(255) UNIQUE, nom VARCHAR(100));FOREIGN KEY (clé étrangère)
Section titled “FOREIGN KEY (clé étrangère)”Pour lier un utilisateur à une adresse :
CREATE TABLE adresse ( id INT PRIMARY KEY, rue VARCHAR(255), ville VARCHAR(255), code_postal VARCHAR(5));
CREATE TABLE utilisateur ( id INT PRIMARY KEY, nom VARCHAR(100), adresse_id INT, FOREIGN KEY (adresse_id) REFERENCES adresse(id));Utilisation de l’option AUTO_INCREMENT (ou SERIAL)
Section titled “Utilisation de l’option AUTO_INCREMENT (ou SERIAL)”Pour que l’identifiant soit généré automatiquement :
MySQL / MariaDB :
CREATE TABLE utilisateur ( id INT AUTO_INCREMENT PRIMARY KEY, nom VARCHAR(100), prenom VARCHAR(100));PostgreSQL :
CREATE TABLE utilisateur ( id SERIAL PRIMARY KEY, nom VARCHAR(100), prenom VARCHAR(100));SQL Server :
CREATE TABLE utilisateur ( id INT IDENTITY(1,1) PRIMARY KEY, nom VARCHAR(100), prenom VARCHAR(100));Compatibilité entre SGBD
Section titled “Compatibilité entre SGBD”| SGBD | Syntaxe particulière |
|---|---|
| MySQL / MariaDB | AUTO_INCREMENT, INT sans précision |
| PostgreSQL | SERIAL ou IDENTITY (v10+), INTEGER |
| SQL Server | IDENTITY(start, increment), INT |
| Oracle | NUMBER au lieu de INT, GENERATED BY DEFAULT AS IDENTITY (v12c+) |
Créer une table à partir d’une autre (copie)
Section titled “Créer une table à partir d’une autre (copie)”Copier la structure uniquement
Section titled “Copier la structure uniquement”-- MySQL / PostgreSQL / SQL ServerCREATE TABLE utilisateur_backup AS SELECT * FROM utilisateur WHERE 1=0;Copier la structure et les données
Section titled “Copier la structure et les données”-- MySQL / PostgreSQL / SQL ServerCREATE TABLE utilisateur_backup AS SELECT * FROM utilisateur;PostgreSQL (version plus robuste) :
CREATE TABLE utilisateur_backup (LIKE utilisateur INCLUDING ALL);Création de tables temporaires
Section titled “Création de tables temporaires”Les tables temporaires sont automatiquement supprimées à la fin de la session.
MySQL / MariaDB :
CREATE TEMPORARY TABLE tmp_utilisateur AS SELECT * FROM utilisateur WHERE pays = 'France';PostgreSQL :
CREATE TEMPORARY TABLE tmp_utilisateur AS SELECT * FROM utilisateur WHERE pays = 'France';SQL Server :
SELECT * INTO #tmp_utilisateur FROM utilisateur WHERE pays = 'France';Bonnes pratiques
Section titled “Bonnes pratiques”1. Choisir des noms de colonnes explicites
Section titled “1. Choisir des noms de colonnes explicites”-- ❌ Noms peu clairsCREATE TABLE u (i INT, n VARCHAR(100));
-- ✅ Noms explicitesCREATE TABLE utilisateur (id INT, nom VARCHAR(100));2. Définir des contraintes appropriées
Section titled “2. Définir des contraintes appropriées”CREATE TABLE utilisateur ( id INT PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP);3. Utiliser des types de données adaptés
Section titled “3. Utiliser des types de données adaptés”-- ❌ Mauvais choixCREATE TABLE produit ( prix VARCHAR(10));
-- ✅ Bon choixCREATE TABLE produit ( prix DECIMAL(10,2));4. Ajouter des index (nous verrons cela plus tard)
Section titled “4. Ajouter des index (nous verrons cela plus tard)”CREATE INDEX idx_utilisateur_nom ON utilisateur(nom);5. Prévoir une colonne pour l’audit
Section titled “5. Prévoir une colonne pour l’audit”CREATE TABLE utilisateur ( id INT PRIMARY KEY, nom VARCHAR(100), date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP, date_modification TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);Erreurs courantes
Section titled “Erreurs courantes”| Erreur | Cause | Solution |
|---|---|---|
Table already exists |
La table existe déjà | Vérifier l’existence ou utiliser IF NOT EXISTS |
Duplicate column name |
Colonne définie deux fois | Vérifier les noms des colonnes |
Cannot add foreign key constraint |
Clé étrangère sur une colonne inexistante | Vérifier la table référencée |
Invalid default value |
Valeur par défaut incorrecte | Vérifier le type de données |
Data type mismatch |
Type de données incohérent | Vérifier la compatibilité des types |
Prochain chapitre
Section titled “Prochain chapitre”Vous savez désormais comment créer une table avec CREATE TABLE. Mais que faire si vous souhaitez modifier la structure d’une table existante ?
👉 Chapitre 29 : ALTER TABLE – Modifier une table
Bonne continuation !
Junior TSAFACK – 08/08/2026