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 resultierendeuser_id
zurück - offensichtlich aus einer Sequenz oder einer anderen Vorgabe. Es ist eigentlich dieuser_id
austable3
, 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?