utilizando los ids devueltos desde insert en, para inserción de loggings con key externa

Tengo una table

monster(id serial, name varchar, primary key(id))

y tengo otra table

ranged_monster(id_monster integer, distance integer, foreign key(id_monster) references monster)

Quiero insert dos monstruos a distancia: uno se llama 'arquero goblin' con una distancia de ataque de range de 10 , y el otro se llama 'dragón' con una distancia de ataque de range de 50 . ¿Cómo puedo hacer esto en una sola instrucción?

hasta ahora, he intentado esto:

la peor manera

 insert into monster(name) values ('archer goblin'), ('dragon'); insert into ranged_monster(distance) values (10) where name='archer goblin'; insert into ranged_monster(distance) values (50) where name='dragon'; 

es malo porque la columna de nombre permite repeticiones, y los loggings recuperados pueden ser más de uno … también tener que escribir el nombre del monstruo dos veces no parece un buen hábito.

insert en … regresar

si la tabla ranged_monster solo tuviera la columna (key externa) de id_monster , entonces podría usar esta solución:

 with the_ids as ( insert into monster(name) values ('archer goblin'), ('dragon') returning id ) insert into ranged_monster(id_monster) select * from the_ids; 

sin embargo, no funciona, porque ranged_monster también tiene la distance columna. Al hacerlo, insertá los identificadores de los monstruos sin distance .

soluciones posibles

cree una tabla temporal con las distancias, y luego combine esta tabla temporal secuencialmente con la insert into ... returning the_ids 's the_ids , y luego inserte estos loggings combinados en la tabla ranged_monster .

¿Cómo puedo combinar dos tablas como he preguntado aquí? Https://stackoverflow.com/questions/31171253/sql-combine-two-tables ? (se marcó como duplicado, vinculándose a este ¿Cuál es la diferencia entre JOIN y UNION?, pero esa pregunta no está relacionada con esa otra pregunta).

 with s(name, distance) as ( values ('archer goblin', 10), ('dragon', 50) ), the_ids as ( insert into monster(name) select name from s returning id, name ) insert into ranged_monster (id_monster, distance) select id, distance from s inner join the_ids using (name)