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?
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 ouser_id
resultante seja devolvido (obviamente a partir de uma sequência ou de algum outro padrão. Na verdade, devolve ouser_id
detable3
, 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: