Estou tentando ter uma maneira reproduzível de preencher um banco de dados com alguns dados de teste.
Suponha (um exemplo muito simplificado com) três tabelas básicas: nome, cidade, trabalho e duas tabelas de relacionamento: nome-cidade e nome-trabalho. Eu preciso criar uma entrada em cada uma das três tabelas base e usar as entradas acima mencionadas para criar entradas nas DUAS tabelas de relacionamento.
O que eu já tenho é uma forma de usar uma série de with
consultas para criar entradas nas 3 tabelas base e inserir valores em UMA tabela de relacionamento.
with x as
(INSERT INTO "public"."name" VALUES(DEFAULT) RETURNING "id"),
y as
(INSERT INTO "public"."job" VALUES(DEFAULT) RETURNING "id"),
z as
(INSERT INTO "public"."city" VALUES(DEFAULT) RETURNING "id")
INSERT INTO "public"."name-job"("name", "job")
select x.id, y.id from x,y;
Eu realmente gostaria de adicionar uma segunda instrução de inserção
INSERT INTO "public"."name-city"("name", "city")
select x.id, z.id from x,z;
após a primeira inserção, mas não sei como. Eu tentei separar as duas instruções de inserção com vírgulas e colocá-las entre parênteses e depois separá-las com vírgulas e algumas outras maneiras, mas nada funciona.
Não é inteiramente uma opção usar uma nova instrução com a segunda inserção porque preciso que os mesmos valores de x, y, z sejam usados. Dada a minha falta de conhecimento/experiência, é perfeitamente possível que eu esteja perdendo algo óbvio... então quaisquer idéias sobre como eu posso fazer isso, idealmente, sem ferramentas altamente sofisticadas, seriam muito bem-vindas.
FWIW, estou usando o Postgres (10.x)
Você precisa colocar o
INSERT INTO "name-job"
em outro CTE. Você também pode colocar a última inserção em"name-city"
um CTE e adicionar umSELECT
para obter todos os IDs inseridos (e qualquer outra coisa que você precise das linhas inseridas) de volta.