Použijte CTE upravující data k řetězení vašich tří INSERTů. Něco jako toto:
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;
-
Obvykle je nejlepší přidat seznam definic sloupců pro
INSERT
s (kromě zvláštních případů). V opačném případě, pokud se struktura tabulky změní, váš kód se může překvapivým způsobem zlomit. -
Vynechal jsem sloupce, do kterých byste zadali pouze
DEFAULT
. Výchozí hodnoty se vkládají automaticky. Kratší, stejný výsledek. -
Poslední, nepovinné
RETURNING
vrátí výslednéuser_id
- zjevně ze sekvence nebo nějakého jiného výchozího nastavení. Ve skutečnosti je touser_id
ztable3
, ale to je stejné, pokud nemáte nějaké spouštěče nebo jiné magické překážky.
Více o CTE upravujících data (také znám jako „zapisovatelné“):
- Jsou dotazy typu SELECT jediným typem, který lze vnořit?