Aller au contenu

INSERT#

essentiel

Syntaxe#

INSERT INTO table (col1, col2, ...)
VALUES (val1, val2, ...), (val1b, val2b, ...);

INSERT INTO table (col1, col2) SELECT ...;

Exemples#

INSERT INTO etudiants (nom, age) VALUES ('Alice', 20);

INSERT INTO etudiants (nom, age) VALUES ('Bob', 22), ('Claire', 19);

INSERT INTO etudiants_copie SELECT * FROM etudiants WHERE age > 18;

Gestion des conflits courant#

INSERT OR IGNORE INTO etudiants (id, nom) VALUES (1, 'Alice');
INSERT OR REPLACE INTO etudiants (id, nom) VALUES (1, 'Alice');
Élément Comportement en cas de conflit de contrainte
OR IGNORE Ignore la ligne, poursuit l'insertion des suivantes
OR REPLACE Supprime la ligne conflictuelle puis insère la nouvelle
OR ABORT (défaut) Annule l'instruction, conserve la transaction
OR FAIL Arrête l'instruction sans annuler les lignes déjà insérées
OR ROLLBACK Annule toute la transaction

Warning

OR REPLACE supprime la ligne existante : les colonnes non fournies reprennent leur valeur par défaut, et les ON DELETE CASCADE associés se déclenchent. Préférer l'UPSERT ci-dessous.

UPSERT (ON CONFLICT) courant#

INSERT INTO etudiants (id, nom, age) VALUES (1, 'Alice', 21)
ON CONFLICT(id) DO UPDATE SET age = excluded.age;

INSERT INTO etudiants (id, nom) VALUES (1, 'Alice')
ON CONFLICT(id) DO NOTHING;

excluded désigne la ligne qui aurait été insérée. Disponible depuis SQLite 3.24.

RETURNING avancé#

INSERT INTO etudiants (nom, age) VALUES ('Dan', 25) RETURNING id, nom;

SQLite ≥ 3.35. En pratique, la plupart des pilotes exposent déjà le dernier identifiant inséré (last_insert_rowid()).

DEFAULT VALUES avancé#

INSERT INTO table DEFAULT VALUES;   -- une ligne, toutes valeurs par défaut

SQLite

La syntaxe ON CONFLICT (UPSERT) est proche de celle de PostgreSQL, mais diffère de INSERT ... ON DUPLICATE KEY UPDATE (MySQL).