🚀 Novembre a commencé ! SQLtest.online reste gratuit grâce aux dons de personnes comme vous. Aidez-nous à atteindre l'objectif de ce mois plus tôt pour que le site fonctionne sans interruption. Soutenir maintenant →
Code SQL copié dans le presse-papiers

SQL INSERT INTO : ajouter des lignes à une table

Leçon 8.1 · Temps de lecture : ~7 min · Exercices pratiques ↓

L'instruction SQL INSERT INTO ajoute de nouvelles lignes à une table. Dans cette leçon, vous apprendrez la syntaxe d'INSERT, pourquoi toujours lister les colonnes, comment insérer plusieurs lignes à la fois, comment copier des données avec INSERT INTO ... SELECT, et comment sont remplies les colonnes NULL, DEFAULT et auto-incrémentées.

Jusqu'ici, toutes les requêtes de ce cours lisaient des données avec SELECT. Avec ce module, vous commencez à modifier les données. INSERT, UPDATE et DELETE forment le langage de manipulation des données (DML) ; INSERT est celui qui crée de nouvelles lignes.

Les bases d'exemple de SQLtest sont en lecture seule, ces instructions y renvoient donc une erreur de permission. Les exemples utilisent le schéma Sakila pour montrer la syntaxe et les règles qu'une vraie base de données applique.

SQL INSERT INTO : une liste de colonnes et une liste VALUES associées par position, auto-incrément et valeurs par défaut pour les colonnes omises, et INSERT INTO ... SELECT

Syntaxe d'INSERT

Avec une liste de colonnes (recommandé)

INSERT INTO table_name (column1, column2, column3)
VALUES (value1, value2, value3);

Les valeurs sont associées aux colonnes par position : la première valeur va dans la première colonne listée, et ainsi de suite. Les colonnes non listées reçoivent leur valeur par défaut ou NULL.

Sans liste de colonnes

INSERT INTO table_name
VALUES (value1, value2, value3, ...);

Il faut alors fournir une valeur pour chaque colonne, dans l'ordre où les colonnes ont été définies dans la table. Si quelqu'un ajoute plus tard une colonne, l'instruction échoue ou, pire, place les valeurs dans les mauvaises colonnes. Listez toujours les colonnes dans le code enregistré et réutilisé.


Insérer une ligne

INSERT INTO actor (first_name, last_name)
VALUES ('JOHNNY', 'DEPP');

Résultat : un nouvel acteur. actor_id est rempli automatiquement (auto-incrément), et last_update reçoit l'heure actuelle grâce à sa valeur par défaut.

Les règles sur les valeurs sont les mêmes que dans WHERE : le texte et les dates entre apostrophes, les nombres sans.


Les colonnes obligatoires

Une colonne définie comme NOT NULL sans valeur par défaut doit recevoir une valeur. Dans Sakila, customer.create_date est une telle colonne :

-- Erreur : Field 'create_date' doesn't have a default value
INSERT INTO customer (store_id, first_name, last_name, email, address_id)
VALUES (1, 'ALICE', 'JOHNSON', 'alice.j@example.com', 5);
-- Correct : la colonne obligatoire a une valeur
INSERT INTO customer (store_id, first_name, last_name, email, address_id, create_date)
VALUES (1, 'ALICE', 'JOHNSON', 'alice.j@example.com', 5, NOW());

Résultat : un nouveau client du magasin 1. customer_id est généré, active reçoit sa valeur par défaut 1.

Les valeurs doivent aussi respecter les clés étrangères : store_id = 1 et address_id = 5 doivent exister dans les tables store et address, sinon la base de données rejette la ligne.


Insérer plusieurs lignes

Plusieurs listes de valeurs séparées par des virgules insèrent plusieurs lignes en une seule instruction :

INSERT INTO actor (first_name, last_name)
VALUES ('TOM', 'HANKS'),
       ('MERYL', 'STREEP'),
       ('LEONARDO', 'DICAPRIO');

Résultat : trois nouveaux acteurs.

Une instruction multi-lignes est bien plus rapide que plusieurs instructions d'une ligne : la base de données l'analyse une seule fois et écrit les modifications en une fois. C'est la méthode standard pour charger des données par lots.


Les valeurs NULL et DEFAULT

NULL écrit « pas de valeur » dans une colonne qui l'autorise :

INSERT INTO customer (store_id, first_name, last_name, email, address_id, create_date)
VALUES (1, 'BOB', 'SMITH', NULL, 5, NOW());

Résultat : un client sans adresse e-mail.

Omettre une colonne la remplit avec sa valeur par défaut, ou NULL s'il n'y en a pas.

DEFAULT demande explicitement la valeur par défaut, ce qui est pratique quand toutes les colonnes sont listées :

INSERT INTO actor (actor_id, first_name, last_name, last_update)
VALUES (DEFAULT, 'CATE', 'BLANCHETT', DEFAULT);

Résultat : actor_id reçoit le numéro d'auto-incrément suivant, last_update l'heure actuelle.


INSERT INTO ... SELECT

Au lieu de VALUES, un INSERT peut prendre ses lignes dans une requête. C'est ainsi qu'on copie des données entre tables, qu'on archive ou qu'on charge des tables de rapport :

INSERT INTO target_table (column1, column2, column3)
SELECT source_column1, source_column2, source_column3
FROM source_table
WHERE condition;

La liste du SELECT peut combiner colonnes, calculs et constantes. Par exemple, si une table customer_archive existe, on peut y copier les clients inactifs :

INSERT INTO customer_archive (customer_id, full_name, archived_at, status_note)
SELECT customer_id,
       CONCAT(first_name, ' ', last_name),
       CURRENT_DATE,
       'Auto-archived'
FROM customer
WHERE active = 0;

Résultat : 15 lignes, une par client inactif, avec le nom complet, la date du jour et une note fixe.

Le nombre et l'ordre des colonnes du SELECT doivent correspondre à la liste de colonnes de l'INSERT. Les noms de colonnes n'ont pas besoin de correspondre ; les positions, si.


Les erreurs courantes d'INSERT

ErreurCause
Column count doesn't match value countLa liste de valeurs et la liste de colonnes n'ont pas la même longueur
Field '…' doesn't have a default valueUne colonne NOT NULL sans valeur par défaut a été omise
Duplicate entry '…' for key 'PRIMARY'La valeur de clé existe déjà
Cannot add or update a child row: a foreign key constraint failsUne ligne référencée n'existe pas
Incorrect … valueUne valeur ne correspond pas au type de données de la colonne

Points clés :

  • INSERT INTO table (columns) VALUES (values) ajoute une ligne ; les valeurs sont associées aux colonnes par position.
  • Listez toujours les colonnes : l'instruction résiste alors aux modifications de la table.
  • Les colonnes NOT NULL sans valeur par défaut doivent recevoir une valeur ; les clés étrangères doivent pointer vers des lignes existantes.
  • Une instruction peut insérer plusieurs lignes : VALUES (...), (...), (...).
  • INSERT INTO ... SELECT insère le résultat d'une requête.
  • Les colonnes omises reçoivent leur valeur par défaut ou NULL ; le mot-clé DEFAULT demande la valeur par défaut explicitement.

Questions fréquentes

Comment insérer plusieurs lignes en SQL ?

Listez plusieurs groupes de valeurs après VALUES, séparés par des virgules : INSERT INTO actor (first_name, last_name) VALUES ('TOM', 'HANKS'), ('MERYL', 'STREEP');. Cela fonctionne dans MySQL, MariaDB, PostgreSQL, SQL Server et SQLite.

Comment copier des lignes d'une table vers une autre ?

Utilisez INSERT INTO target (columns) SELECT columns FROM source WHERE condition;. Le SELECT doit renvoyer le même nombre de colonnes, dans le même ordre, que la liste de colonnes de la cible.

Que deviennent les colonnes que je ne liste pas dans INSERT ?

Elles reçoivent leur valeur par défaut. Une clé auto-incrémentée reçoit le numéro suivant. Si une colonne n'a pas de valeur par défaut, elle reçoit NULL, ou l'instruction échoue si la colonne est NOT NULL.

Essayez de resoudre les exercices suivants pour consolider ce que vous avez appris dans cette lecon.

  1. Créer un nouvel enregistrement d'adresse
  2. Ajouter un nouvel employé
  3. Créer la table des îles