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
INSERT
s (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
RETURNING
final y opcional devuelve eluser_id
resultante - obviamente de una secuencia o algún otro valor predeterminado. En realidad es eluser_id
detable3
, 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?