Insert (SQL)
INSERTâ
est une commande SQL qui ajoute un ou plusieurs tuples dans une table d'une base de données relationnelle.
Forme basique
La commande INSERT a la syntaxe suivante :
INSERT INTO table (column1 [, column2, column3 ... ]) VALUES (value1 [, value2, value3 ... ])
Le nombre de colonnes doit ĂȘtre identique au nombre de valeurs. Si une colonne n'est pas spĂ©cifiĂ©e, sa valeur par dĂ©faut lui sera affectĂ©e. Les valeurs insĂ©rĂ©es doivent respecter toutes les contraintes tel que les clĂ©s Ă©trangĂšres, clĂ©s primaires, et les colonnes NOT NULL. Si la commande contient une erreur de syntaxe, ou si une contrainte n'est pas respectĂ©e, les valeurs ne sont pas insĂ©rĂ©es et une erreur est rapportĂ©e.
Exemple :
INSERT INTO film_cast (firstname, lastname) VALUES ('Raoul', 'Duke')
Une Ă©criture plus concise existe, sans nommer les colonnes, insĂ©rant les valeurs dans le mĂȘme ordre que les colonnes de la table. Il n'est pas nĂ©cessaire de prĂ©ciser toutes les colonnes, les colonnes restantes prendront leurs valeurs par dĂ©faut.
Syntaxe :
INSERT INTO table VALUES (value1, [value2, ... ])
L'exemple prĂ©cĂ©dent peut donc ĂȘtre rĂ©ecrit, si et seulement si les deux premiĂšres colonnes de la table film_cast sont firstname et lastname:
INSERT INTO film_cast VALUES ('Raoul', 'Duke');
Formes avancées
Insertion multiples
Depuis SQL-92 il est possible d'insĂ©rer plusieurs tuples en une seule requĂȘte :
INSERT INTO table (column-a, [column-b, ...])
VALUES ('value-1a', ['value-1b', ...]),
('value-2a', ['value-2b', ...]),
...
Cette fonctionnalité est supportée par DB2, SQL Server (Depuis la version 10.0), PostgreSQL (depuis la version 8.2), MySQL, SQLite (depuis la version 3.7.11) et H2.
Exemple (considérant que 'firstname' et 'lastname' sont les deux seules colonnes de la table 'film_cast'):
INSERT INTO film_cast VALUES ('Raoul', 'Duke'), ('Dr.', 'Gonzo')
Les insertions multiples sont particuliĂšrement intĂ©ressantes en termes de performance. Il est donc conseillĂ© pour une application qui doit insĂ©rer beaucoup lignes par seconde d'utiliser des requĂȘtes multiples pour rĂ©duire le nombre de requĂȘtes effectuĂ©es et la charge du serveur. L'utilisation de requĂȘte multiples permet d'insĂ©rer plus de tuples qu'une sĂ©rie d'insertions simples pour un temps donnĂ©.
Afin d'insérer plusieurs tuples en utilisant MS SQL, la construction suivante est utilisable :
INSERT INTO film_cast
SELECT 'Raoul', 'Duke'
UNION ALL
SELECT 'Dr.', 'Gonzo'
Cependant ce n'est pas une requĂȘte SQL valide selon le standard SQL:2003 dĂ» Ă la sous requĂȘte SELECT incomplĂšte.
Il est aussi possible de le faire sous Oracle en utilisant la table DUAL:
INSERT INTO film_cast
SELECT 'Raoul', 'Duke' FROM DUAL
UNION ALL
SELECT 'Dr.','Gonzo' FROM DUAL
Une implémentation respectant les standards SQL:
INSERT INTO film_cast
SELECT 'Raoul', 'Duke' FROM LATERAL ( VALUES (1) ) AS t(c)
UNION ALL
SELECT 'Dr.','Gonzo' FROM LATERAL ( VALUES (1) ) AS t(c)
Oracle PL/SQL supporte la syntaxe "INSERT ALL", dans laquelle les requĂȘtes d'insertions multiples sont terminĂ©s par un SELECT[1]:
INSERT ALL
INTO film_cast VALUES ('Raoul', 'Duke')
INTO film_cast VALUES ('Dr.', 'Gonzo')
SELECT * FROM DUAL
Avec la base de données Firebird, l'insertion multiple est possible grùce à la syntaxe :
INSERT INTO film_cast ("firstname", "lastname")
SELECT 'Raoul', 'Duke' FROM RDB$DATABASE
UNION ALL
SELECT 'Dr.', 'Gonzo' FROM RDB$DATABASE
Cependant, Firebird restreint le nombre de tuples qui peuvent ĂȘtre insĂ©rĂ©s par cette syntaxe dĂ» Ă la limite du nombre de contextes utilisables en une seule requĂȘte.
Copier des tuples depuis une autre table
Une seule requĂȘte INSERT peut aussi ĂȘtre utilisĂ©e pour rĂ©cupĂ©rer des donnĂ©es depuis une autre table, les modifier si nĂ©cessaire, puis les insĂ©rer directement dans une table. Dans ce cas, une sous-requĂȘte est utilisĂ©e Ă la place de la clause VALUES :
INSERT INTO film_cast2 ( firstname, lastname )
SELECT firstname, lastname
FROM film_cast
WHERE firstname IN ('Raoul', 'Dr.')
Récupération de la clef primaire
Il est souvent nĂ©cessaire d'obtenir la cle primaire artificielle qui a Ă©tĂ© auto-gĂ©nĂ©rĂ©e par le moteur de base de donnĂ©es lors d'une insertion afin de l'utiliser dans des requĂȘtes suivantes. Il existe, en fonction du moteur utilisĂ©, diffĂ©rentes mĂ©thodes pour l'obtenir :
- En utilisant une procédure stockée spécifique au moteur de base de données tel que SCOPE_IDENTITY() en SQL Server, ou last_insert_rowid() en SQLite.
- En utilisant une requĂȘte SELECT spĂ©cifique au moteur de base de donnĂ©es sur une table temporaire contenant le dernier tuple insĂ©rĂ©. DB2 implĂ©mente cette fonctionnalitĂ© de la maniĂšre suivante :
SELECT *
FROM NEW TABLE (
INSERT INTO film_cast
VALUES ('Raoul', 'Duke')
) AS t
- DB2 pour z/OS implémente cette fonctionnalité de la maniÚre suivante :
SELECT *
FROM FINAL TABLE (
INSERT INTO film_cast
VALUES ('Raoul', 'Duke')
)
- En effectuant une requĂȘte SELECT aprĂšs l'INSERT avec une fonction spĂ©cifique Ă la base de donnĂ©es qui renvoie la clef primaire gĂ©nĂ©rĂ©e pour la derniĂšre insertion effectuĂ©e, tel que LAST_INSERT_ID() pour MySQL.
- En utilisant la syntaxe OUTPUT lors de la requĂȘte d'insertion, avec MS-SQL Server 2005 et MS-SQL Server 2008.
- En utilisant le mot clé RETURNING avec Oracle :
INSERT INTO film_cast VALUES ('Raoul', 'Duke')
RETURNING film_cast_id INTO v_pb_id
- En utilisant le mot clef RETURNING avec PostgreSQL (depuis la version 8.2). Le résultat est identique au résultat d'un SELECT.
Firebird utilise la mĂȘme syntaxe, cependant la requĂȘte ne pourra insĂ©rer qu'un seul tuple[2].
INSERT INTO film_cast VALUES ('Raoul', 'Duke')
RETURNING film_cast_id
- En utilisant la fonction IDENTITY() avec H2 :
SELECT IDENTITY()
DĂ©clencheurs (Triggers)
Si des dĂ©clencheurs (triggers en anglais) sont dĂ©finis sur la table dans laquelle la requĂȘte insĂšre, ils seront exĂ©cutĂ©s dans le contexte de la requĂȘte. BEFORE INSERT permet la modification des valeurs qui devront ĂȘtre insĂ©rĂ©es, AFTER INSERT ne peut plus modifier les donnĂ©es mais peut ĂȘtre utilisĂ© pour initier des actions sur d'autres tables.
Articles connexes
Notes et références
- (en) « Oracle PL/SQL: INSERT ALL », psoug.org (consulté le )
- (en) « Firebird 2.5 Language Reference Update » (consulté le )