PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 13.22 » Référence » Commandes SQL » INSERT

INSERT

INSERT — InsĂ©rer de nouvelles lignes dans une table

Synopsis

[ WITH [ RECURSIVE ] requĂȘte_with [, ...] ]
INSERT INTO nom_table [ AS alias ] [ ( nom_colonne [, ...] ) ]
    [ OVERRIDING { SYSTEM | USER } VALUE ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | requĂȘte }
    [ ON CONFLICT [ cible_conflit ] action_conflit ]
    [ RETURNING { * | expression_sortie [ [ AS ] nom_sortie ] } [, ...] ]

oĂč cible_conflit peut valoir :

    ( { nom_colonne_index | ( expression_index ) } [ COLLATE collation ] [ classe_operateur ] [, ...] ) [ WHERE predicat_index ]
    ON CONSTRAINT nom_contrainte

et action_conflit peut valoir :

    DO NOTHING
    DO UPDATE SET { nom_colonne = { expression | DEFAULT } |
                    ( nom_colonne [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
                    ( nom_colonne [, ...] ) = ( sous-SELECT )
                  } [, ...]
              [ WHERE condition ]
  

Description

INSERT insĂšre de nouvelles lignes dans une table. Vous pouvez insĂ©rer une ou plusieurs lignes spĂ©cifiĂ©es par les expressions de valeur, ou zĂ©ro ou plusieurs lignes provenant d'une requĂȘte.

L'ordre des noms des colonnes n'a pas d'importance. Si aucune liste de noms de colonnes n'est donnĂ©e, toutes les colonnes de la table sont utilisĂ©e dans l'ordre de leur dĂ©claration (les N premiers noms de colonnes si seules N valeurs de colonnes sont fournies dans la clause VALUES ou dans la requĂȘte). Les valeurs fournies par la clause VALUES ou par la requĂȘte sont associĂ©es Ă  la liste explicite ou implicite des colonnes de gauche Ă  droite.

Chaque colonne absente de la liste, implicite ou explicite, des colonnes se voit attribuer sa valeur par défaut, s'il y en a une, ou NULL dans le cas contraire.

Un transtypage automatique est entrepris lorsque l'expression d'une colonne ne correspond pas au type de donnée déclaré.

Des INSERT dans des tables pour lesquelles il manque des index d'unicitĂ© ne seront pas bloquĂ©s par des activitĂ©s concurrentes. Les tables avec des index d'unicitĂ© pourraient bloquer si des sessions concurrentes rĂ©alisent des actions qui verrouillent ou modifient des lignes correspondant aux valeurs en cours d'insertion dans l'index ; les dĂ©tails sont disponibles dans Section 61.5. ON CONFLICT peut ĂȘtre utilisĂ© pour indiquer une action alternative lorsqu'une erreur sur une contrainte unique ou une contrainte d'exclusion est levĂ©e (voir Clause ON CONFLICT ci-dessous).

La clause RETURNING optionnelle fait que INSERT calcule et renvoie le(s) valeur(s) basée(s) sur chaque ligne en cours d'insertion (ou mises à jour si une clause ON CONFLICT DO UPDATE a été utilisée). C'est principalement utile pour obtenir les valeurs qui ont été fournies par défaut, comme un numéro de séquence. Néanmoins, toute expression utilisant les colonnes de la table est autorisée. La syntaxe de la liste RETURNING est identique à celle de la commande SELECT. Seules les lignes qui ont été insérées ou mises à jour avec succÚs sont retournées. Par exemple, si une ligne a été verrouillée mais non mise à jour parce que la condition de la clause ON CONFLICT DO UPDATE ... WHERE n'a pas été satisfaite, la ligne ne sera pas renvoyée.

Vous devez avoir le droit INSERT sur une table pour insérer des données dedans. Si ON CONFLICT DO UPDATE est indiqué, le droit UPDATE est aussi requis.

Si une liste de colonnes est indiquĂ©e, vous avez seulement besoin d'avoir le droit INSERT sur les colonnes spĂ©cifiĂ©es. De la mĂȘme maniĂšre, lorsque ON CONFLICT DO UPDATE est indiquĂ©, vous avez seulement besoin d'avoir le droit UPDATE sur les colonnes qui sont listĂ©es comme Ă  mettre Ă  jour. Cependant, ON CONFLICT DO UPDATE exige Ă©galement le droit SELECT sur toutes les colonnes dont les valeurs sont lues dans l'expression de ON CONFLICT DO UPDATE ou la condition.

L'utilisation de la clause RETURNING requiert le droit SELECT sur toutes les colonnes mentionnĂ©es dans RETURNING. Si vous utilisez la clause requĂȘte pour insĂ©rer des lignes Ă  partir d'une requĂȘte, vous avez bien sĂ»r besoin d'avoir le droit SELECT sur toutes les tables ou colonnes rĂ©fĂ©rencĂ©es dans la requĂȘte.

ParamĂštres

Insertion

Cette section concerne les paramĂštres qui peuvent ĂȘtre utilisĂ©s lors de l'insertion de nouvelles lignes. Les paramĂštres exclusivement utilisĂ©s avec la clause ON CONFLICT sont dĂ©crits sĂ©parĂ©ment.

requĂȘte_with

La clause WITH vous permet de spĂ©cifier une ou plusieurs sous-requĂȘtes qui peuvent ĂȘtre rĂ©fĂ©rencĂ©es par leur nom dans la commande INSERT. Voir Section 7.8 et SELECT pour les dĂ©tails.

Il est possible que la requĂȘte (commande SELECT) contienne Ă©galement une clause WITH. Dans un tel cas, les deux ensembles de requĂȘte_with peuvent ĂȘtre rĂ©fĂ©rencĂ©s Ă  l'intĂ©rieur de requĂȘte, mais le second prime dans la mesure oĂč il est plus proche.

nom_table

Le nom (éventuellement préfixé du schéma) d'une table existante.

alias

Un nom de substitution pour nom_table. Lorsqu'un alias est indiqué, il masque complÚtement le nom actuel de la table. Ceci est particuliÚrement utile lorsque ON CONFLICT DO UPDATE fait référence à une table nommée excluded, puisque sinon ce nom serait utilisé pour le nom de la table spéciale représentant la ligne proposée à l'insertion.

nom_colonne

Le nom d'une colonne dans la table nommĂ©e par nom_table. Le nom de la colonne peut ĂȘtre qualifiĂ© avec un nom de sous-champ ou un indice de tableau, si besoin. (L'insertion uniquement dans certains champs d'une colonne composite positionne les autres champs Ă  NULL.) Lorsque vous rĂ©fĂ©rencez une colonne avec ON CONFLICT DO UPDATE, n'incluez pas le nom de la table dans la spĂ©cification de la colonne. Par exemple, INSERT INTO nom_table ... ON CONFLICT DO UPDATE tab SET nom_table.col = 1 est invalide (ceci est conforme au comportement gĂ©nĂ©ral pour la commande UPDATE).

OVERRIDING SYSTEM VALUE

Si cette clause est indiquée, alors toutes les valeurs fournies par les colonnes d'identité surchargeront les valeurs par défaut générées par les séquences.

Pour une colonne d'identité définie comme GENERATED ALWAYS, insérer une valeur explicite (autre que DEFAULT) sans préciser soit OVERRIDING SYSTEM VALUE soit OVERRIDING USER VALUE est considéré comme une erreur. (Pour une colonne d'identité définie comme GENERATED BY DEFAULT, OVERRIDING SYSTEM VALUE est le comportement normal et le préciser ne change rien mais PostgreSQL l'autorise comme extension.)

OVERRIDING USER VALUE

Si cette clause est spécifiée, alors toute valeur fournir pour les colonnes d'identité sont ignorées et les valeurs par défaut générée par la séquence sont appliquées.

Cette clause est utile par exemple lors de la copie de valeur entre des tables. Écrire INSERT INTO tbl2 OVERRIDING USER VALUE SELECT * FROM tbl1 copiera de tbl1 toutes les colonnes de tbl2 qui ne sont pas des colonnes d'identitĂ© dans tbl2 alors que des valeurs pour les colonnes d'identitĂ© dans tbl2 seront gĂ©nĂ©rĂ©es par les sĂ©quences associĂ©es avec tbl2.

DEFAULT VALUES

Toutes les colonnes seront remplies avec leur valeur par défaut, comme si DEFAULT était indiqué explicitement pour chaque colonne. (Une clause OVERRIDING n'est pas permise dans cette forme.)

expression

Une expression ou valeur Ă  assigner Ă  la colonne correspondante.

DEFAULT

La colonne correspondante sera remplie avec sa valeur par défaut. Une colonne d'identité sera remplie avec une nouvelle valeur générée par la séquence associée. Pour une colonne générée, l'indiquer est permis mais ne fait que préciser le comportement normal du calcul de la colonne à partir de son expression de génération.

requĂȘte

Une requĂȘte (commande SELECT) qui fournit les lignes Ă  insĂ©rer. RĂ©fĂ©rez-vous Ă  la commande SELECT pour une description de la syntaxe.

expression_sortie

Une expression Ă  calculer et Ă  retourner par la commande INSERT aprĂšs que chaque ligne soit insĂ©rĂ©e ou mise Ă  jour. L'expression peut utiliser n'importe quel nom de colonnes de la table nommĂ©e nom_table. Écrivez * pour renvoyer toutes les colonnes de(s) ligne(s) insĂ©rĂ©e(s) ou mise(s) Ă  jour.

nom_sortie

Un nom à utiliser pour une colonne renvoyée.

Clause ON CONFLICT

La clause optionelle ON CONFLICT indique une action alternative lors d'une erreur de violation d'une contrainte unique ou d'exclusion. Pour chaque ligne individuelle proposée pour l'insertion, soit l'insertion est effectuée, soit si une contrainte arbitrale ou un index indiqué par cible_conflit est violé, l'action alternative cible_conflit est effectuée. ON CONFLICT DO NOTHING évite simplement d'insérer une ligne comme action alternative. Comme action alternative, ON CONFLICT DO UPDATE met à jour la ligne existante en conflit avec la ligne proposée pour l'insertion.

cible_conflit peut effectuer une inférence d'un index unique. L'inférence consiste à indiquer un ou plusieurs nom_colonne_index et/ou expression_index. Tous les index uniques de nom_table qui, indépendamment de l'ordre, contiennent exactement les colonnes/expressions cible_conflit spécifiées sont inférés (choisis) comme index arbitraux. Si un predicat_index est indiqué, il doit, comme une condition supplémentaire pour l'inférence, satisfaire les index arbitraux. Notez que cela signifie qu'un index unique non partiel (un index unique sans prédicat) sera inféré (et donc utilisé par ON CONFLICT) si un tel index remplissant l'ensemble des autres critÚres est disponible. Si une tentative d'inférence est impossible, une erreur est levée.

ON CONFLICT DO UPDATE garantit un traitement atomique de INSERT ou de UPDATE ; dans la mesure oĂč il n'y a pas d'erreur indĂ©pendante, l'un de ces deux traitements est garanti, y compris en cas d'accĂšs concurrents. Ceci est aussi connu sous le nom d'UPSERT (« UPDATE ou INSERT Â»).

cible_conflit

Indique les conflits ON CONFLICT entrainant l'action alternative en choisissant les index arbitraux. Soit effectue l'infĂ©rence d'un index unique, soit nomme une contrainte explicitement. Pour ON CONFLICT DO NOTHING, l'indication de cible_conflit est facultatif ; s'il est omis, les conflits avec toutes les contraintes utilisables (et index uniques) sont retenus. Pour ON CONFLICT DO UPDATE, cible_conflit doit ĂȘtre indiquĂ©.

action_conflit

action_conflit indique une action alternative Ă  ON CONFLICT. Elle peut ĂȘtre soit une clause DO NOTHING, soit une clause DO UPDATE indiquant le dĂ©tail exact de l'action UPDATE Ă  effectuer en cas de conflit. Les clauses SET et UPDATE dans ON CONFLICT DO UPDATE ont accĂšs Ă  la ligne existante en utilisant le nom de la table (ou un alias), et Ă  la ligne proposĂ©e Ă  l'insertion en utilisant la table spĂ©ciale de nom excluded. Le droit SELECT est requis sur l'ensemble des colonnes de la table cible oĂč les colonnes correspondantes de excluded sont lues.

Notez que les effets de tous les trigegrs par ligne BEFORE INSERT sont reflĂ©tĂ©s dans les valeurs de excluded, dans la mesure oĂč ces effets peuvent avoir contribuĂ©s Ă  la ligne exclue de l'insertion.

nom_colonne_index

Le nom d'une colonne de nom_table. Utilisé pour inférer les index arbitraux. Suit le format de CREATE INDEX. Le droit SELECT sur nom_colonne_index est nécessaire.

expression_index

Similaire à nom_colonne_index, mais utilisé pour inférer les expressions sur les colonnes de nom_table apparaissant dans les définitions de l'index (pas de simples colonnes). Suit le format de CREATE INDEX. Le droit SELECT sur toutes les colonnes apparaissant dans expression_index est nécessaire.

collation

Lorsque mentionnĂ©, indique que la colonne nom_colonne_index correspondante ou expression_index utilise une collation particuliĂšre pour ĂȘtre mis en correspondance durant l'infĂ©rence. Typiquement, ceci est omis, dans la mesure oĂč les collations n'ont gĂ©nĂ©ralement pas d'incidence sur la survenu ou non d'une violation de contrainte. Suit le format de CREATE INDEX.

classe_operateur

Lorsque mentionnĂ©, elle indique que la colonne nom_colonne_index correspondante ou expression_index utilise une classe d'opĂ©rateurs en particulier pour ĂȘtre mis en correspondance durant l'infĂ©rence. Typiquement, ceci est omis, dans la mesure oĂč les sĂ©mantiques d'Ă©galitĂ© sont souvent Ă©quivalentes entre les diffĂ©rents types de classes d'opĂ©rateurs, ou parce qu'il est suffisant de s'appuyer sur le fait que les dĂ©finitions d'index uniques ont une dĂ©finition pertinente de l'Ă©galitĂ©. Suit le format de CREATE INDEX.

predicat_index

UtilisĂ© pour permettre l'infĂ©rence d'index uniques partiels. Tous les index qui satisfont le prĂ©dicat (qui ne sont pas nĂ©cessairement des index partiels) peuvent ĂȘtre infĂ©rĂ©s. Suit le format de CREATE INDEX. Le droit SELECT sur toutes les colonnes apparaissant dans predicat_index est nĂ©cessaire.

nom_contrainte

Spécifie explicitement une contrainte arbitrale par nom, plutÎt que d'inférer une contrainte par nom ou index.

condition

Une expression qui renvoie une valeur de type boolean. Seules les lignes pour lesquelles cette expression renvoie true seront mises à jour, bien que toutes les lignes seront verrouillées lorsque l'action ON CONFLICT DO UPDATE est prise. Notez que condition est évaluée en dernier, aprÚs qu'un conflit ait été identifié comme un candidat à la mise à jour.

Notez que les contraintes d'exclusion ne sont pas supportées comme arbitres avec ON CONFLICT DO UPDATE. Dans tous les cas, seules les contraintes NOT DEFERRABLE et les index uniques sont supportés comme arbitres.

La commande INSERT avec une clause ON CONFLICT DO UPDATE est une instruction dĂ©terministe. Ceci signifie que la commande ne sera pas autorisĂ©e Ă  modifier n'importe quelle ligne individuelle plus d'une fois ; une erreur de violation de cardinalitĂ© sera levĂ©e si cette situation arrive. Les lignes proposĂ©es Ă  l'insertion ne devraient pas avoir de duplication les unes par rapport aux autres relativement aux attributs contraints par un index arbitral ou une contrainte.

Notez qu'il n'y a pas de support d'une clause ON CONFLICT DO UPDATE d'un INSERT appliquée à une table partitionnée pour mettre à jour la clé de partitionnement d'une ligne en conflit qui causerait le déplacement de la ligne dans une nouvelle partition.

Astuce

Il est souvent préférable d'utiliser l'inférence d'un index unique plutÎt que de nommer une contrainte directement en utilisant ON CONFLICT ON CONSTRAINT nom_contrainte. L'inférence continuera de fonctionner correctement lorsque l'index sous-jacent est remplacé par un autre plus ou moins équivalent de maniÚre recouvrante, par exemple en utilisant CREATE UNIQUE INDEX ... CONCURRENTLY avant de supprimer l'index remplacé.

Sorties

En cas de succĂšs, la commande INSERT renvoie un code de la forme

INSERT oid nombre 

nombre correspond au nombre de lignes insérées ou mises à jour. oid vaut toujours 0 (il s'agissait de l'OID affecté à la ligne insérée si count valait exactement 1 et que la table cible était déclarée WITH OIDS et 0 dans les autres cas, mais créer une table WITH OIDS n'est plus supporté).

Si la commande INSERT contient une clause RETURNING, le résultat sera similaire à celui d'une instruction SELECT contenant les colonnes et les valeurs définies dans la liste RETURNING, à partir de la liste des lignes insérées ou mises à jour par la commande.

Notes

Si la table spécifiée est une table partitionnée, chaque ligne est redirigée vers la partition appropriée et insérée dedans. Si la table spécifiée est une partition, une erreur sera remontée si une des lignes en entrée viole la contrainte de partition.

Exemples

InsĂ©rer une ligne dans la table films :

INSERT INTO films
	VALUES ('UA502', 'Bananas', 105, '1971-07-13', 'Comédie', '82 minutes');
   

Dans l'exemple suivant, la colonne longueur est omise et prend donc sa valeur par dĂ©faut :

INSERT INTO films (code, titre, did, date_prod, genre)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drame');
   

L'exemple suivant utilise la clause DEFAULT pour les colonnes date plutĂŽt qu'une valeur prĂ©cise :

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comédie', '82 minutes');
INSERT INTO films (code, titre, did, date_prod, genre)
    VALUES ('T_601', 'Yojimbo', 106, DEFAULT, 'Drame');
   

InsĂ©rer une ligne constituĂ©e uniquement de valeurs par dĂ©faut :

INSERT INTO films DEFAULT VALUES;
   

Pour insĂ©rer plusieurs lignes en utilisant la syntaxe multi-lignes VALUES :

INSERT INTO films (code, titre, did, date_prod, genre) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');
   

InsĂ©rer dans la table films des lignes extraites de la table tmp_films (la disposition des colonnes est identique dans les deux tables) :

INSERT INTO films SELECT * FROM tmp_films WHERE date_prod < '2004-05-07';
   

InsĂ©rer dans des colonnes de type tableau :

-- Créer un jeu de 3 cases sur 3
INSERT INTO tictactoe (game, board[1:3][1:3])
    VALUES (1, '{{" "," "," "},{" "," "," "},{" "," "," "}}');
-- Les indices de l'exemple ci-dessus ne sont pas vraiment nécessaires
INSERT INTO tictactoe (game, board)
    VALUES (2, '{{X," "," "},{" ",O," "},{" ",X," "}}');
   

InsĂ©rer une ligne simple dans la table distributeurs, en renvoyant le numĂ©ro de sĂ©quence gĂ©nĂ©rĂ© par la clause DEFAULT :

INSERT INTO distributeurs (did, dnom) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;
   

Augmenter le nombre de ventes du vendeur qui gĂšre le compte Acme Corporation, et enregistrer la ligne complĂštement mise Ă  jour avec l'heure courante dans une table de traçage :

WITH upd AS (
  UPDATE employees SET sales_count = sales_count + 1 WHERE id =
    (SELECT sales_person FROM accounts WHERE name = 'Acme Corporation')
    RETURNING *
)
INSERT INTO employees_log SELECT *, current_timestamp FROM upd;
   

InsĂ©rer ou mettre Ă  jour de nouveaux distributeurs comme appropriĂ©. Suppose qu'un index unique a Ă©tĂ© dĂ©fini qui contraint les valeurs apparaissant dans la colonne did. Notez que la table spĂ©ciale excluded est utilisĂ©e pour rĂ©fĂ©rencer les valeurs proposĂ©es Ă  l'origine pour l'insertion :

INSERT INTO distributeurs (did, dnom)
    VALUES (5, 'Gizmo Transglobal'), (6, 'Associated Computing, Inc')
    ON CONFLICT (did) DO UPDATE SET dnom = EXCLUDED.dnom;
   

InsĂ©rer un distributeur, ou ne fait rien pour les lignes proposĂ©es Ă  l'insertion lorsqu'une ligne existante, exclue (une ligne avec une contrainte correspondante sur une ou plusieurs colonnes aprĂšs que les triggers aprĂšs ou avant se soient dĂ©clenchĂ©s) existe. L'exemple suppose qu'un index unique a Ă©tĂ© dĂ©fini qui contraint les valeurs apparaissant dans la colonne did :

INSERT INTO distributeurs (did, dnom) VALUES (7, 'Redline GmbH')
    ON CONFLICT (did) DO NOTHING;
   

InsĂ©rer ou mettre Ă  jour de nouveaux distributeurs comme appropriĂ©. L'exemple suppose qu'un index unique a Ă©tĂ© dĂ©fini qui contraint les valeurs apparaissant dans la colonne did. La clause WHERE est utilisĂ©e pour limiter les lignes mises Ă  jour (toutes les lignes existantes non mises Ă  jour seront tout de mĂȘme verrouillĂ©es) :

-- Ne pas mettre Ă  jour les distributeurs existants avec un certain code postal
INSERT INTO distributeurs AS d (did, dnom) VALUES (8, 'Anvil Distribution')
    ON CONFLICT (did) DO UPDATE
    SET dnom = EXCLUDED.dnom || ' (précédemment ' || d.dnom || ')'
    WHERE d.code_postal <> '21201';

-- Nomme une contrainte directement dans l'instruction (utilise
-- l'index associé pour décider de prendre l'action DO NOTHING)
INSERT INTO distributeurs (did, dnom) VALUES (9, 'Antwerp Design')
    ON CONFLICT ON CONSTRAINT distributeurs_pkey DO NOTHING;
   

InsĂ©rer un nouveau distributeur si possible ; sinon DO NOTHING. L'exemple suppose qu'un index unique a Ă©tĂ© dĂ©fini qui contraint les valeurs apparaissant dans la colonne did Ă  un sous-ensemble des lignes oĂč la colonne boolĂ©enne est_actif est Ă©valuĂ©e Ă  true :

-- Cette instruction pourrait inférer un index unique partiel sur "did"
-- avec un prédicat de type "WHERE est_actif", mais il pourrait aussi
-- juste utiliser une contrainte unique réguliÚre sur "did"
INSERT INTO distributeurs (did, dnom) VALUES (10, 'Conrad International')
    ON CONFLICT (did) WHERE est_actif DO NOTHING;
   

Compatibilité

INSERT est conforme au standard SQL, sauf la clause RETURNING qui est une extension PostgreSQL, comme la possibilitĂ© d'utiliser la clause WITH avec l'instruction INSERT, et de spĂ©cifier une action alternative avec ON CONFLICT. Le standard n'autorise toutefois pas l'omission de la liste des noms de colonnes alors qu'une valeur n'est pas affectĂ©e Ă  chaque colonne, que ce soit Ă  l'aide de la clause VALUES ou Ă  partir de la requĂȘte.

The SQL standard spĂ©cifie que OVERRIDING SYSTEM VALUE ne peut ĂȘtre spĂ©cifiĂ© que si une colonne d'identitĂ© qui est toujours gĂ©nĂ©rĂ©e existe. PostgreSQL autorise cette clause dans tous les cas et l'ignore si elle ne s'applique pas.

Les limitations possibles de la clause requĂȘte sont documentĂ©es sous SELECT.