es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede lograr tomar los IDs devueltos por una instrucción INSERT e insertarlos en otra tabla.

Tengo estas 3 tablas

receta: recipe_id | name

ingrediente: ingredient_id | name

recetas_ingredientes: id | recipe_id | ingredient_id

El primer id de cada tabla es un SERIAL PRIMARY KEY y los dos nombres son character varying(50). Estoy tratando de insertar en la tercera tabla recipe_id y ingredient_id usando RETURNING, pero no funciona. Ya intenté los tres INSERT individualmente y funcionan perfectamente, el problema parece ocurrir cuando los pongo juntos usando WITH o no puede tomar los ids devueltos.

Aquí está mi SQL:

BEGIN; — iniciar transacción

WITH new_recipe AS (
INSERT INTO recipe (name) VALUES (‘{}’) RETURNING recipe_id
),
new_ingredient AS (
INSERT INTO ingredient (name) VALUES (‘{}’) RETURNING ingredient_id
)

INSERT INTO recetas_ingredientes (recipe_id, ingredient_id) VALUES (new_recipe.recipe_id, new_ingredient.ingredient_id)

COMMIT; — finalizar transacción

Este es el error que obtengo:

ERROR: error de sintaxis cerca de “WITH”
LINE 5: WITH new_ingredient AS (
^
SQL state: 42601
Character: 117

Ya revisé otras preguntas similares en stackoverflow y me parece que usé la misma pregunta exacta. Así que no entiendo dónde está el error.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el error en el código SQL se debe al uso de dos declaraciones WITH en una sola consulta de SQL, lo cual no está permitido. En este caso, puedes combinar las dos declaraciones WITH en una sola, de la siguiente manera:

    BEGIN;
    WITH new_recipe AS (
        INSERT INTO recipe (name) VALUES ('{}') RETURNING recipe_id
    ),
    new_ingredient AS (
        INSERT INTO ingredient (name) VALUES ('{}') RETURNING ingredient_id
    )
    INSERT INTO recipes_ingredients (recipe_id, ingredient_id)
    SELECT new_recipe.recipe_id, new_ingredient.ingredient_id FROM new_recipe, new_ingredient;
    COMMIT;
    

    Al usar una sola declaración WITH y luego una consulta SELECT para hacer referencia a las dos cláusulas RETURNING, puedes insertar los datos necesarios en la tabla recipes_ingredients.

    ¡Espero que esto ayude!

Comments are closed.