sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL multi INSERT... VOLVER con múltiples columnas

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 el user_id resultante - obviamente de una secuencia o algún otro valor predeterminado. En realidad es el user_id de table3 , 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?