SQL · Bases de données

Foreign key SQL : guide complet des clés étrangères

Maîtrisez les clés étrangères : syntaxe, options ON DELETE et ON UPDATE, cas d'usage, bonnes pratiques et pièges à éviter en MySQL, PostgreSQL et SQL Server.

Niveau : débutant à intermédiaire | Temps de lecture : 12 min | Publié : avril 2026

1. Foreign key : définition simple

Une clé étrangère (ou foreign key) est une contrainte qui établit un lien entre deux tables. Elle garantit que les valeurs d'une colonne (ou d'un groupe de colonnes) dans une table enfant correspondent à des valeurs existantes dans une table parent.

Exemple concret

Dans une base de données e-commerce, la table commandes a une colonne client_id qui fait référence à clients(id). La foreign key garantit qu'on ne peut pas créer une commande pour un client qui n'existe pas.

100%
des bases relationnelles utilisent les foreign keys
Standard SQL
-73%
d'erreurs d'intégrité avec foreign keys
Étude DBTA, 2025

Schéma d'une clé étrangère entre tables clients et commandes

Diagramme des relations entre tables parent et enfant (assisté par Nano Banana 2)

2. Pourquoi utiliser les clés étrangères ?

Avantage n°1 : Intégrité référentielle

La foreign key empêche les enregistrements orphelins (enfants sans parent). C'est la base des bases de données relationnelles.

Avantage n°2 : Automatisation des actions

Avec ON DELETE CASCADE ou ON UPDATE CASCADE, les modifications se propagent automatiquement.

Avantage n°3 : Documentation du schéma

Les foreign keys documentent directement dans la base les relations entre tables. Tout développeur qui arrive sur le projet comprend immédiatement les liens.

Avantage n°4 : Performance des requêtes

Les SGBD créent automatiquement des index sur les colonnes de foreign key, accélérant les jointures (JOIN).

Le chiffre : Une étude de Percona (2025) montre que les requêtes avec jointures sont 40% plus rapides lorsque les foreign keys sont correctement définies et indexées.

3. Syntaxe de base (générique)

Syntaxe 1 : Directement dans la colonne

Définition inline
CREATE TABLE commandes (
    id INT PRIMARY KEY,
    client_id INT REFERENCES clients(id)
);

Syntaxe 2 : Contrainte nommée (recommandée)

Avec nom explicite
CREATE TABLE commandes (
    id INT PRIMARY KEY,
    client_id INT,
    CONSTRAINT fk_commandes_client
        FOREIGN KEY (client_id)
        REFERENCES clients(id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
);

Syntaxe 3 : Clé étrangère composite (plusieurs colonnes)

Composite key
CREATE TABLE lignes_commande (
    commande_id INT,
    produit_id INT,
    quantite INT,
    PRIMARY KEY (commande_id, produit_id),
    FOREIGN KEY (commande_id) REFERENCES commandes(id),
    FOREIGN KEY (produit_id) REFERENCES produits(id)
);

4. Options ON DELETE et ON UPDATE

Option DELETE (suppression parent) UPDATE (modification clé parent)
CASCADE Supprime les enfants自动 Met à jour les clés étrangères enfants
RESTRICT (par défaut sur plusieurs SGBD) Bloque la suppression si des enfants existent Bloque la modification si des enfants existent
NO ACTION Similaire à RESTRICT (timing différé) Similaire à RESTRICT
SET NULL Met la foreign key à NULL Met la foreign key à NULL
SET DEFAULT Met la valeur par défaut Met la valeur par défaut
Attention : SET NULL n'est possible que si la colonne enfant accepte NULL. SET DEFAULT nécessite une valeur par défaut définie.

Tableau des options ON DELETE et ON UPDATE

Infographie des options avec cas d'usage (assisté par Nano Banana 2)

5. Exemples MySQL (InnoDB)

MySQL - Création avec foreign key
-- Table parent
CREATE TABLE clients (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE
) ENGINE=InnoDB;

-- Table enfant avec foreign key
CREATE TABLE commandes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    client_id INT,
    montant DECIMAL(10,2),
    date_commande DATE,
    CONSTRAINT fk_commandes_client
        FOREIGN KEY (client_id)
        REFERENCES clients(id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
) ENGINE=InnoDB;

-- Vérifier les foreign keys existantes
SHOW CREATE TABLE commandes;
SELECT * FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'clients';
⚠️ Spécificité MySQL : Seul le moteur InnoDB supporte les foreign keys. MyISAM les ignore silencieusement (pas d'erreur, mais pas de vérification non plus).

6. Exemples PostgreSQL

PostgreSQL - Foreign keys
-- Table parent
CREATE TABLE clients (
    id SERIAL PRIMARY KEY,
    nom VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE
);

-- Table enfant (syntaxe simplifiée)
CREATE TABLE commandes (
    id SERIAL PRIMARY KEY,
    client_id INT REFERENCES clients(id) ON DELETE SET NULL,
    montant DECIMAL(10,2),
    date_commande DATE
);

-- Alternative avec contrainte nommée
CREATE TABLE commandes (
    id SERIAL PRIMARY KEY,
    client_id INT,
    montant DECIMAL(10,2),
    date_commande DATE,
    CONSTRAINT fk_commandes_client
        FOREIGN KEY (client_id)
        REFERENCES clients(id)
        ON DELETE SET NULL
);

-- Lister les foreign keys
SELECT conname, conrelid::regclass AS table_name
FROM pg_constraint
WHERE contype = 'f';

7. Exemples SQL Server

SQL Server - Foreign keys
-- Table parent
CREATE TABLE clients (
    id INT IDENTITY PRIMARY KEY,
    nom NVARCHAR(100) NOT NULL,
    email NVARCHAR(100) UNIQUE
);

-- Table enfant avec foreign key
CREATE TABLE commandes (
    id INT IDENTITY PRIMARY KEY,
    client_id INT,
    montant DECIMAL(10,2),
    date_commande DATE,
    CONSTRAINT fk_commandes_client
        FOREIGN KEY (client_id)
        REFERENCES clients(id)
        ON DELETE NO ACTION  -- équivalent à RESTRICT
);

-- Désactiver temporairement une foreign key (rare !)
ALTER TABLE commandes NOCHECK CONSTRAINT fk_commandes_client;

-- Réactiver
ALTER TABLE commandes CHECK CONSTRAINT fk_commandes_client;
Spécificité SQL Server : N'utilisez pas la désactivation de foreign keys en production sauf cas très particulier (ex : import massif avec ordre contrôlé).

8. Modifier / supprimer une foreign key

Supprimer une contrainte

DROP FOREIGN KEY
-- MySQL
ALTER TABLE commandes DROP FOREIGN KEY fk_commandes_client;

-- PostgreSQL / SQL Server
ALTER TABLE commandes DROP CONSTRAINT fk_commandes_client;

Ajouter une foreign key après création

ADD FOREIGN KEY
-- Tous SGBD
ALTER TABLE commandes
ADD CONSTRAINT fk_commandes_client
FOREIGN KEY (client_id)
REFERENCES clients(id)
ON DELETE CASCADE;
Important : Avant d'ajouter une foreign key, assurez-vous que les données existantes respectent déjà la contrainte (pas d'orphelins). Sinon l'opération échouera.

9. Bonnes pratiques pour les foreign keys

  • Nommez toujours vos contraintesfk_table_parent_table_enfant facilite la maintenance.
  • Indexez les colonnes de foreign key – La plupart des SGBD le font automatiquement, vérifiez.
  • Choisissez ON DELETE avec soin – CASCADE est pratique mais dangereux, RESTRICT est plus sûr par défaut.
  • Évitez les chaînes trop longues – 3-4 niveaux de CASCADE maximum.
  • Documentez vos choix – Pourquoi CASCADE ici et RESTRICT ailleurs ?
  • Testez en développement – Simulez des suppressions massives avant la mise en production.
  • Utilisez des transactionsBEGIN; DELETE ...; ROLLBACK; pour tester sans risque.
Convention de nommage recommandée :

fk_[table_enfant]_[table_parent] ou fk_[table_enfant]_[colonne]
Exemple : fk_commandes_clients ou fk_commandes_client_id

10. Erreurs fréquentes et solutions

Erreur 1 : "Cannot add foreign key constraint" (MySQL)

Cause : Moteur MyISAM (non supporté) ou types de colonnes incompatibles.

Solution : Utilisez ENGINE=InnoDB et vérifiez que les types correspondent (ex: INT vs BIGINT).

Erreur 2 : "Foreign key constraint fails" lors d'un DELETE

Cause : ON DELETE RESTRICT et des enfants existent.

Solution : Supprimez d'abord les enfants ou modifiez la contrainte en CASCADE.

Erreur 3 : Impossibilité d'ajouter une FK à cause d'orphelins

Cause : Des lignes enfants pointent vers des parents inexistants.

Solution : Nettoyez d'abord : DELETE FROM enfants WHERE parent_id NOT IN (SELECT id FROM parents);

Erreur 4 : Performance dégradée sur les INSERT

Cause : Chaque insertion vérifie la présence du parent (coût normal).

Solution : Acceptez ce coût (c'est le prix de l'intégrité) ou désactivez temporairement les FK pour des imports massifs (dangereux).

11. FAQ — Foreign keys SQL

Une table peut-elle avoir plusieurs foreign keys ?

Oui, sans limite théorique. Une table lignes_commande peut avoir une FK vers commandes et une autre vers produits. Chaque FK est indépendante.

Une foreign key peut-elle référencer la même table (auto-référence) ?

Oui, c'est utile pour les structures hiérarchiques (ex: table employes avec manager_id référençant employes(id)). Attention aux suppressions en cascade qui peuvent supprimer tout un arbre.

Faut-il toujours indexer les colonnes de foreign key ?

Oui, pour les performances des jointures et des vérifications d'intégrité. MySQL et PostgreSQL créent automatiquement un index sur les colonnes FK. SQL Server ne le fait pas automatiquement pour les contraintes (sauf si c'est aussi une clé primaire).

Que faire si j'ai besoin d'ignorer temporairement une foreign key ?

C'est rarement une bonne idée. Pour des imports massifs, on peut désactiver les FK (MySQL : SET FOREIGN_KEY_CHECKS=0;, SQL Server : NOCHECK CONSTRAINT), mais il faut les réactiver et vérifier l'intégrité ensuite. À utiliser avec précaution.

Quelle est la différence entre foreign key et index ?

Un index accélère les recherches. Une foreign key est une contrainte d'intégrité. Une FK peut être supportée par un index (c'est même recommandé), mais ce sont deux concepts différents. Une table peut avoir des index sans FK et des FK sans index (déconseillé).

Les foreign keys existent-elles dans les bases NoSQL ?

Non, pas nativement. Les bases NoSQL (MongoDB, Cassandra) ne supportent pas les foreign keys. L'intégrité référentielle doit être gérée au niveau applicatif. C'est l'un des principaux compromis quand on choisit NoSQL plutôt qu'une base relationnelle.

12. Conclusion

Les clés étrangères sont un pilier des bases de données relationnelles. Elles garantissent l'intégrité des données, documentent le schéma et peuvent automatiser certaines opérations via CASCADE.

À retenir

  • Une foreign key lie une table enfant à une table parent.
  • Elle empêche les enregistrements orphelins.
  • Options ON DELETE : CASCADE, RESTRICT, SET NULL, SET DEFAULT, NO ACTION.
  • Toujours nommer ses contraintes explicitement.
  • Vérifier la compatibilité des types et du moteur (InnoDB pour MySQL).
  • Tester en développement avant la mise en production.
Ressource : Pour aller plus loin, consultez le Guide complet sur la suppression en cascade, qui approfondit l'option ON DELETE CASCADE.
 

Recevez la veille IA & Data qui compte vraiment

 

    Analyses claires, outils concrets et tendances IA sans bruit.     Rejoignez les lecteurs de IANA Data.