SQL CREATE TABLE

Par :

,le

La commande SQL CREATE TABLE définit et crée une table vide avec des colonnes et des types prédéfinis prête à recevoir les vraies informations qui y seront stockées. Chaque colonne reçoit un nom unique, un type de données spécifique et parfois des contraintes d’intégrité. Les lignes représentent les enregistrements complets d’un objet métier. Les contraintes intégrées protègent l’intégrité référentielle dès la première insertion.

Syntaxe de base pour l’instruction CREATE TABLE

La requête SQL CREATE TABLE est immédiatement suivie par le nom de la table puis d’une parenthèse ouvrante . Chaque déclaration de colonne contient le nom puis le type de donnée comme INT ou VARCHAR. La parenthèse fermante termine la définition complète de la structure.

CREATE TABLE tableName (
    field1 INT,
    field2 VARCHAR(255),
    field3 Date
);

Types de données de base

Les types numériques stockent des valeurs entières avec INT ou des décimales précises avec DECIMA, INT va de -2 147 483 648 à 2 147 483 647

Les types texte utilisent VARCHAR pour des longueurs de chaînes de caractères variables ou TEXT pour des contenus étendus, VARCHAR(50) accepte jusqu’à 50 caractères de texte modifiable.

Les types temporels utilisent DATE pour les calendriers ou DATETIME pour un horodatage complet. DATE enregistre l’année, mois et jour au format international 2026-01-22.

CREATE TABLE utilisateurs (
    id INT,
    nom VARCHAR(100),
    salaire DECIMAL(10,2),
    date_embauche DATE
);

Contraintes disponibles lors de la création d’une table

L’instruction CREATE TABLE intègre des règles de validation pour chaque colonne créée. Une contrainte vérifie automatiquement les données lors de chaque insertion ou mise à jour ce qui empêchent les erreurs dès l’origine de l’enregistrement.

Une clé primaire doit être unique

La clé primaire identifie chaque enregistrement par une valeur unique et obligatoire. Le système refuse automatiquement les doublons sur cette colonne essentielle. La commande AUTO_INCREMENT génère la valeur suivante sans intervention manuelle. La clé primaire optimise les performances des recherches et jointures entre tables temporaires ou physiques.

id INT PRIMARY KEY AUTO_INCREMENT

NOT NULL impose la présence d’une valeur pour le champ

Cette contrainte d’intégrité exige une valeur non vide pour la colonne spécifiée. L’insertion sans spécifier de contenu provoque un rejet immédiat de l’opération ce qui garantit la complétude des informations critiques. NOT NULL protège contre les bases remplies de valeurs manquantes inutiles.

email VARCHAR(255) NOT NULL

UNIQUE interdit les doublons

L’instruction UNIQUE accepte une seule occurrence de chaque valeur dans la colonne, sans quoi, une erreur est déclenchée. UNIQUE protège les identifiants métier comme des codes produits ou des emails clients.

code_produit VARCHAR(20) UNIQUE

Les clés étrangères ou FOREIGN KEY

La contrainte de clé étrangère relie plusieurs tables par des colonnes communes. La colonne liée référence la clé primaire d’une table parente existante et le système valide l’existence de la valeur avant toute insertion. L’instruction FOREIGN KEY maintient la cohérence logique entre des tables dispersées.

CREATE TABLE factures (
    id INT PRIMARY KEY AUTO_INCREMENT,
    client_id INT,
    montant DECIMAL(10,2),
    FOREIGN KEY (client_id) REFERENCES clients(id)
);

Valeurs par défaut

Le mot-clé DEFAULT fournit une valeur automatique si l’utilisateur omet le champ lors de l’insertion de nouvelles données réduisant ainsi les erreurs lors de premières utilisations de la table. CURRENT_TIMESTAMP génère l’horodatage du moment précis d’insertion ce qui simplifie les insertions partielles courantes.

status ENUM('actif','inactif') DEFAULT 'actif',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

Cas pratique avec CREATE TABLE AS SELECT

Cette commande duplique la structure et le contenu d’une requête de sélection existante. La sous-requête définit les colonnes et les lignes copiées dans la nouvelle table ce qui génère rapidement des tables de test ou des archives.

CREATE TABLE clients_2025 AS 
SELECT * FROM clients 
WHERE annee_creation = 2025;

Index intégrés avec CREATE TABLE

CREATE TABLE déclare des index pour accélérer les requêtes fréquentes sur les colonnes. L’INDEX sur un champ filtré optimise souvent les performances des requêtes de sélection. UNIQUE INDEX combine unicité et rapidité de recherche simultanément.

CREATE TABLE utilisateurs (
    id INT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(255) NOT NULL,
    nom VARCHAR(100),
    INDEX idx_email (email)
);

Compatibilité de la commande SQL CREATE TABLE entre les différents SGBDR

Cette instruction suit le standard SQL ANSI avec des extensions propres à chaque système. MySQL lie AUTO_INCREMENT au moteur transactionnel d’InnoDB. SQL Server, quant à lui, distingue les tables locales temporaires des tables permanentes.

PostgreSQL 18

PostgreSQL implémente SERIAL équivalent au standard INT AUTO_INCREMENT. Les contraintes d’unicité CHECK valident les plages de valeurs automatiquement. Les schémas organisent les tables par domaine fonctionnel clair.

CREATE TABLE clients (
    id SERIAL PRIMARY KEY,
    nom VARCHAR(100) NOT NULL CHECK (LENGTH(nom) > 2)
);

MySQL 8.4

MySQL nécessite l’instruction ENGINE=InnoDB pour les contraintes de clés étrangères . CHARSET UTF8MB4 supporte tous les caractères internationaux Unicode. AUTO_INCREMENT redémarre à 1 après l’exécution de la commande SQL TRUNCATE TABLE.

CREATE TABLE produits (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nom VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
) ENGINE=InnoDB;

SQL Server 2025

SQL Server utilise IDENTITY pour l’auto-incrémentation avec un incrément personnalisable. CLUSTERED INDEX définit l’ordre physique de stockage des données et FILEGROUP répartit les tables sur des volumes disque différents.

CREATE TABLE orders (
    order_id INT IDENTITY(1000,1) PRIMARY KEY CLUSTERED
);

Bonnes pratiques avec la commande CREATE TABLE

Cette commande respecte des conventions strictes pour la maintenabilité à long terme. Les noms de tables utilisent le pluriel comme « clients » ou « commandes » et les préfixes les organisent par domaine comme user_ ou product_.

Nommage standard des tables

Les tables pluriel représentent des collections d’entités métier uniques. Les longueurs restent inférieures à 64 caractères pour une compatibilité universelle et les conventions snake_case ou PascalCase se choisissent selon les conventions d’équipe.

CREATE TABLE user_profiles (
    user_id INT PRIMARY KEY,
    avatar_filename VARCHAR(255),
    preferences JSON
);

Sélection optimisée des types

INT UNSIGNED économise l’espace pour des identifiants toujours positifs, alors que TINYINT(1) stocke des booléens 0/1 avec un minimum d’espace disque. TIMESTAMP gère les dates internationales avec fuseau horaire.

is_active TINYINT(1) DEFAULT 1,
preferences JSON,
last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP

Cas pratiques pour un site e-commerce

Un site e-commerce structure deux tables principales reliées par des clés étrangères. La table produits contient les références, prix et stocks disponibles. La table clients stocke les profils complets avec historique d’achats via la table commandes.

CREATE TABLE produits (
    id INT PRIMARY KEY AUTO_INCREMENT,
    reference VARCHAR(50) UNIQUE NOT NULL,
    nom VARCHAR(200) NOT NULL,
    prix DECIMAL(10,2) NOT NULL,
    stock INT UNSIGNED DEFAULT 0,
    INDEX idx_reference (reference)
);

CREATE TABLE commandes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    client_id INT NOT NULL,
    produit_id INT NOT NULL,
    quantite INT UNSIGNED NOT NULL,
    date_commande TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE,
    FOREIGN KEY (produit_id) REFERENCES produits(id) ON DELETE RESTRICT
);

Sources: Postgresql, MySql , SQL Server