Użyj modyfikacji danych CTE aby połączyć trzy WKŁADKI. Coś takiego:
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;
-
Zazwyczaj najlepiej jest dodać listę definicji kolumny dla
INSERT
s (z wyjątkiem szczególnych przypadków). W przeciwnym razie, jeśli zmieni się struktura tabeli, Twój kod może się zepsuć w zaskakujący sposób. -
Pominąłem kolumny, w których wystarczy wpisać
DEFAULT
. Wartości domyślne są wstawiane automatycznie. Krótszy, ten sam wynik. -
Ostateczny, opcjonalny
RETURNING
zwraca wynikowyuser_id
- oczywiście z sekwencji lub jakiegoś innego domyślnego. W rzeczywistości jest touser_id
ztable3
, ale to tak samo, chyba że masz jakieś wyzwalacze lub inną magię.
Więcej o modyfikowaniu danych (tzw. „zapisywalny”) CTE:
- Czy zapytania typu SELECT są jedynym typem, który można zagnieżdżać?