Puis-je utiliser la valeur de retour d'INSERT...de RETOUR dans un autre INSERT?
Est quelque chose comme cela possible?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
comme l'utilisation de la valeur de retour de la valeur à insérer une ligne dans une autre table avec une référence à la première table?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire en commençant par Postgres 9.1:
En attendant, si vous êtes uniquement intéressé par l'id, vous pouvez le faire avec un seuil de déclenchement:
rows
avec(some_query returning ...)
peut fonctionner de nos jours (n'ai pas essayé).La meilleure pratique pour ce genre de situation. Utilisation
RETOUR ... EN
.RETURNING ... INTO
.En ligne avec la réponse donnée par Denis de Bernardy..
Si vous voulez id pour être renvoyée par la suite aussi bien et souhaitez insérer plus de choses dans Table2:
Vous pouvez utiliser le
lastval()
fonction:Donc quelque chose comme ceci:
Cela fonctionne très bien tant que personne n'appelle
nextval()
sur n'importe quel autre séquence (dans la session en cours) entre vos INSERTs.Comme Denis ci-dessous et j'ai prévenu au sujet ci-dessus, à l'aide de
lastval()
peut vous causer des ennuis si une autre séquence est accessible à l'aide denextval()
entre vos INSERTs. Cela peut arriver s'il y a un déclencheur d'INSERTION surTable1
manuellement appelénextval()
sur une séquence ou, plus probablement, a fait un INSERT sur une table avec unSÉRIE
ouBIGSERIAL
clé primaire. Si vous voulez être vraiment paranoïaque (une bonne chose, ils vraiment, êtes-vous pour obtenir de vous, après tout), alors vous pouvez utilisercurrval()
mais vous auriez besoin de connaître le nom de la séquence:L'généré automatiquement la séquence est généralement nommé
t_c_seq
oùt
est le nom de la table etc
est le nom de la colonne, mais vous pouvez toujours trouver en allant danspsql
et en disant:et puis, regardant la valeur par défaut pour la colonne en question, par exemple:
FYI:
lastval()
est, plus ou moins, la version de PostgreSQL MySQL estLAST_INSERT_ID
. Je mentionne cela parce que beaucoup de gens sont plus familiers avec MySQL que PostgreSQL lienlastval()
à quelque chose de familier pourrait clarifier les choses.lastval
est qu'il pourrait y avoir une séquence basée INSÉRER derrière votre dos et un APRÈS déclencheur INSERT sur la table Table1. Qui serait à la session en cours et serait, sans doute, le changementlastval()
lorsque vous n'êtes pas l'attendre.Testé avec psql (10.3, serveur 9.6.8)