PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL Multi INSERT...RETURNING mit mehreren Spalten

Verwenden Sie datenmodifizierende CTEs um Ihre drei INSERTs zu verketten. Etwa so:

WITH ins1 AS (
   INSERT INTO table1 (username, name,  surname)
   VALUES ('johnee','john','smith')
   RETURNING user_id
   )
, ins2 AS (
   INSERT INTO table2 (user_id, password)
   SELECT ins1.user_id, 'secret'
   FROM   ins1                            -- nothing to return here
   )
INSERT INTO table3 (user_id, adress, city, phone)
SELECT ins1.user_id, ...
FROM   ins1
RETURNING user_id;
  • Normalerweise ist es am besten, eine Spaltendefinitionsliste hinzuzufügen für INSERT s (außer in Sonderfällen). Andernfalls könnte Ihr Code auf überraschende Weise brechen, wenn sich die Tabellenstruktur ändert.

  • Ich habe Spalten weggelassen, in die Sie einfach DEFAULT eingeben würden . Standardwerte werden automatisch eingefügt. Kürzer, gleiches Ergebnis.

  • Das abschließende, optionale RETURNING gibt die resultierende user_id zurück - offensichtlich aus einer Sequenz oder einer anderen Vorgabe. Es ist eigentlich die user_id aus table3 , aber das ist dasselbe, es sei denn, Sie haben einige Auslöser oder andere magische Einflüsse.

Weitere Informationen zum Ändern von Daten (auch bekannt als "beschreibbar") CTEs:

  • Sind Abfragen vom Typ SELECT der einzige Typ, der verschachtelt werden kann?