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 paraINSERT
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 apenasDEFAULT
. Os padrões são inseridos automaticamente. Mais curto, mesmo resultado.
-
ORETURNING
final e opcional retorna ouser_id
resultante - obviamente de uma sequência ou algum outro padrão. Na verdade, é ouser_id
detable3
, 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?