Как я могу запретить внутреннему SELECT возвращать NULL (когда нет строк) и принудительно выполнить запрос.
INSERT INTO tt (t1_id, t2_id) VALUES (
(SELECT id FROM t1 WHERE ...),
(SELECT id FROM t2 WHERE ...)
);
Боковой вопрос: есть ли лучший способ сформировать этот запрос (t1_id, t2_id - внешние ключи, но может быть NULL)?
Как насчет чего-то типа:
INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id FROM t1, t2 WHERE ...
Просто убедитесь, что SELECT
возвращает именно то, что вы хотите INSERT
, поэтому, если возможно, что для t1.id
и t2.id
будет NULL, тогда включите соответствующее предложение в условие WHERE
(... AND t1.id IS NOT NULL AND t2.id IS NOT NULL ...
).
Вы также можете использовать SELECT DISTINCT
, если есть вероятность появления повторяющихся строк.
Изменить: Если вам нужны 2 идентификатора из разных строк одной таблицы:
SELECT t1.id, t2.id FROM some_table AS t1, some_table AS t2
WHERE ...
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 ...)
Это может показаться неудобным и избыточным, но любой исполнитель SQL, заслуживающий его соли, не будет выполнять каждую часть дважды.
Альтернативно, если t1 и t2 связаны каким-то образом:
INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id
FROM t1
JOIN t2 ON ...
WHERE ...
Это можно улучшить и использовать, как указано ниже.
INSERT INTO tt (t1_id, t2_id)
выберите отличный t1.id, t2.id
из t1, t2
где t1.id = t2.id
и t1.id не является нулевым
и t2 id не является нулевым
);
ALTER TABLE
чтобы изменить два столбца, чтобы они не допускали значенийNULL
.