Inserir multi PostgreSQL ... a voltar com várias colunas

estou a construir uma base de dados com Postgres 9.3 como infra-estrutura, com 3 tabelas:

table1 (user_id, username, name, surname, emp_date)
table2 (pass_id, user_id, password)
table3 (user_dt_id, user_id, adress, city, phone)

como se pode ver table2 e table3 são tabelas de crianças de table1.
Posso extrair o user_id de uma linha recentemente inserida em table1 (pai):

INSERT INTO "table1" (default,'johnee','john','smith',default) RETURNING userid;

preciso de inserir o id recentemente extraído (de table1) em user_id colunas de table2 e table3 juntamente com outros dados únicos para essas tabelas. Basicamente 3 x INSERT ...
Como faço isso?

Author: Erwin Brandstetter, 2014-04-01

1 answers

Uso CTEs modificadores de Dados para acorrentar as três inserções. Algo do género:

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;
  • Recomenda-se adicionar sempre uma lista de definição de colunas para inserções (excepto para o código ad-hoc). Caso contrário, se a estrutura da tabela mudar, o seu código pode quebrar de formas surpreendentes.

  • Eu omiti as colunas da lista de definição de colunas onde você iria simplesmente digitar DEFAULT. Os valores por omissão são aplicados automaticamente. Mais curto, mesmo resultado.

  • O RETURNING final é opcional se quiser que o user_id resultante seja devolvido (obviamente a partir de uma sequência ou de algum outro padrão. Na verdade, devolve o user_id de table3, mas é o mesmo, a menos que tenha alguns gatilhos ou outra magia a interferir.

Mais detalhes sobre modificação de dados (t. c. p. "writable") antes:

 4
Author: Erwin Brandstetter, 2017-05-23 12:08:38