PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL multi INSERT...RETURNING com várias colunas


Use CTEs de modificação de dados para encadear seus três INSERTs. Algo assim:
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;

  • Normalmente, é melhor adicionar uma lista de definição de coluna para INSERT s (exceto em casos especiais). Caso contrário, se a estrutura da tabela mudar, seu código pode quebrar de maneiras surpreendentes.

  • Eu omiti colunas onde você digitaria apenas DEFAULT . Os padrões são inseridos automaticamente. Mais curto, mesmo resultado.

  • O RETURNING final e opcional retorna o user_id resultante - obviamente de uma sequência ou algum outro padrão. Na verdade, é o user_id de table3 , mas é o mesmo, a menos que você tenha alguns gatilhos ou outra mágica interferindo.

Mais sobre CTEs de modificação de dados (também conhecidos como "graváveis"):
  • As consultas do tipo SELECT são o único tipo que pode ser aninhado?