Я в конце концов разобрался сам. Мы можем начать с преобразования данных веб-перехватчика в производную таблицу для выбора с помощью WHERE NOT IN
SELECT 1 as store_category_id, 1 as store_option_id UNION SELECT 1, 2;
В Mysql CLI это дает результат:
+-------------------+-----------------+
| store_category_id | store_option_id |
+-------------------+-----------------+
| 1 | 1 |
| 1 | 2 |
+-------------------+-----------------+
2 rows in set (0.00 sec)
Для запроса эту таблицу с предложением where необходимо включить в подзапрос другого select и дать таблице псевдоним:
SELECT store_category_id, store_option_id FROM (
SELECT 1 as store_category_id, 1 as store_option_id
UNION SELECT 1, 2
) AS vt WHERE store_option_id = 1;
Это дает результат:
+-------------------+-----------------+
| store_category_id | store_option_id |
+-------------------+-----------------+
| 1 | 1 |
+-------------------+-----------------+
1 row in set (0.00 sec)
Теперь мы можно использовать предложение where в сочетании с другим подзапросом для выбора строк для вставки:
SELECT store_category_id, store_option_id FROM (
SELECT 1 as store_category_id, 1 as store_option_id
UNION SELECT 1, 2
) AS vt WHERE (category_id, option_id) NOT IN (
SELECT store_category_id, store_option_id
FROM store_category_options
);
Результат:
+-------------------+-----------------+
| store_category_id | store_option_id |
+-------------------+-----------------+
| 1 | 2 |
+-------------------+-----------------+
1 row in set (0.00 sec)
Наконец, чтобы вставить строки, которые мы рассчитали, мы включаем предыдущий оператор выбора внутри оператора INSERT INTO SELECT
INSERT INTO store_category_options
(store_category_id, store_option_id)
SELECT store_category_id, store_option_id FROM (
SELECT 1 as store_category_id, 1 as store_option_id
UNION SELECT 1, 2
) AS vt WHERE (store_category_id, store_option_id) NOT IN (
SELECT store_category_id, store_option_id
FROM store_category_options
);