Gebruik gegevensmodificerende CTE's om uw drie INSERT's aan elkaar te koppelen. Zoiets als dit:
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;
-
Het is meestal het beste om een kolomdefinitielijst toe te voegen voor
INSERT
s (behalve in speciale gevallen). Anders, als de tabelstructuur verandert, kan je code op verrassende manieren breken. -
Ik heb kolommen weggelaten waar je gewoon
DEFAULT
. zou invoeren . Standaardwaarden worden automatisch ingevoegd. Korter, zelfde resultaat. -
De laatste, optionele
RETURNING
geeft de resulterendeuser_id
. terug - uiteraard van een reeks of een andere standaard. Het is eigenlijk deuser_id
vantable3
, maar dat is hetzelfde, tenzij je een aantal triggers of andere magische interferentie hebt.
Meer over het wijzigen van gegevens (ook bekend als "beschrijfbaar") CTE's:
- Zijn zoekopdrachten van het SELECT-type het enige type dat kan worden genest?