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é#
SQLite ≥ 3.35. En pratique, la plupart des pilotes exposent déjà le dernier identifiant inséré (last_insert_rowid()).
DEFAULT VALUES avancé#
SQLite
La syntaxe ON CONFLICT (UPSERT) est proche de celle de PostgreSQL, mais diffère de INSERT ... ON DUPLICATE KEY UPDATE (MySQL).