Pregunta

¿Cómo puedo evitar que SELECT interno devuelva NULL (cuando no coincide con ninguna fila) y forzar que la consulta falle?

INSERT INTO tt (t1_id, t2_id) VALUES (
  (SELECT id FROM t1 WHERE ...),
  (SELECT id FROM t2 WHERE ...)
);

Pregunta secundaria: ¿hay una mejor manera de formar esta consulta (t1_id, t2_id son claves foráneas, pero podrían ser NULL)?

¿Fue útil?

Solución

¿Qué tal algo como:

INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id FROM t1, t2 WHERE ...

Solo asegúrese de que SELECT devuelve exactamente lo que desea INSERT , por lo que si es posible para t1.id y t2 .id para ser NULL y luego incluir la cláusula relevante en su condición WHERE ( ... AND t1.id NO ES NULL Y t2.id NO ES NULL ... ).

También puede preferir usar SELECT DISTINCT si existe la posibilidad de que aparezcan filas duplicadas.

Editar: si necesita 2 ID de diferentes filas de la tabla misma :

SELECT t1.id, t2.id FROM some_table AS t1, some_table AS t2
WHERE ...

Otros consejos

INSERT INTO tt (t1_id, t2_id) VALUES (
  (SELECT id FROM t1 WHERE ...),
  (SELECT id FROM t2 WHERE ...)
)
WHERE EXISTS (SELECT id FROM t1 WHERE ...)
AND (SELECT id FROM t2 WHERE ...)

Puede parecer incómodo y redundante, pero cualquier ejecutor de SQL que valga la pena no ejecutará cada parte dos veces.

Alternativamente, si t1 y t2 están relacionados de alguna manera:

INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id
FROM t1
JOIN t2 ON ...
WHERE ...

Esto se puede mejorar y usar como se indica a continuación

INSERTAR EN tt (t1_id, t2_id)
seleccione distintos t1.id, t2.id
de t1, t2
donde t1.id = t2.id
y t1.id no es nulo
y t2 id no es nulo
);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top