Usar CTE de modificación de datos para encadenar sus tres INSERTOS. Algo como esto:
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;
-
Por lo general, es mejor agregar una lista de definición de columna para
INSERTs (salvo casos especiales). De lo contrario, si la estructura de la tabla cambia, su código podría romperse de formas sorprendentes. -
Omití las columnas en las que simplemente ingresarías
DEFAULT. Los valores predeterminados se insertan automáticamente. Más corto, mismo resultado. -
El
RETURNINGfinal y opcional devuelve eluser_idresultante - obviamente de una secuencia o algún otro valor predeterminado. En realidad es eluser_iddetable3, pero eso es lo mismo a menos que tengas algunos disparadores u otra magia interfiriendo.
Más información sobre la modificación de datos (también conocida como "escribible") CTE:
- ¿Son las consultas de tipo SELECT el único tipo que se puede anidar?