У меня есть MySQL база данных с 2 таблицами products
и product_variants
. У продукта есть много вариантов продукта. Вот пример:
products
+----+------+
| id | name |
+----+------+
| 1 | Foo |
| 2 | Bar |
+----+------+
product_variants
+----+-------------+--------+
| id | product_id | value |
+----+-------------+--------+
| 10 | 1 | red |
| 11 | 1 | green |
| 12 | 1 | blue |
| 13 | 2 | red |
| 14 | 2 | yellow |
+----+-------------+--------+
Теперь мне нужно массово вставить множество продуктов с их вариантами наиболее эффективным и быстрым способом. У меня есть JSON со многими продуктами (100k +), такими как:
[
{
"name": "Foo",
"variants": [{ "value": "red" }, { "value": "green" }, { "value": "blue" }]
},
{
"name": "Bar",
"variants": [{ "value": "red" }, { "value": "yellow" }]
},
...
]
, из которого я должен сгенерировать запрос для вставки продуктов.
Моя идея заключается в использовании insert
запрос такой:
INSERT INTO `products` (name) VALUES ("foo"), ("bar"), ...;
Но тогда я не знаю, какой product_id
(внешний ключ) использовать в запросе вставки для product_variants
:
INSERT INTO `product_variants` (product_id,value) VALUES (?,"red"), (?,"green"), ...;
(эти запросы внутри транзакции)
Я думал указать идентификаторы продукта вручную, с шагом по сравнению с последним идентификатором, но я получаю ошибки, когда одновременное соединение вставляет продукты одновременно или когда одновременно выполняется 2 или более процесса массовой вставки.
Какую стратегию я могу использовать для достижения своей цели? Есть ли стандартный способ сделать это?
ps: если возможно, я бы не хотел менять структуру двух таблиц.