dllweb
@dllweb

Массовое обновление множества полей, как лучше реализовать?

Представим ситуацию, у меня есть товар и куча опций, опции подвязаны к товару, опции и товары разделены соответственно по таблицам и взаимодействуют по принципу один ко многим, вопрос в следующем, допустим мы хотим обновить какую-то часть опций и добавить новые, в товаре, как лучше обновить и добавить новые данные в опциях?

Из вариантов: удалить все имеющиеся опции по id связи товара, добавить новые, соответственно старые обновятся, новые добавятся, таким вариантом пользуется известная cms opencart, но в этом случае я думаю что она несколько не правильно реализует этот алгоритм, т.к она сначала удаляет данные, потом заново вставляет, новые и старые данные, от этого растет autoincrement и в случае ошибки можно просто напросто затереть данные, а не обновить и добавить, какие ещё варианты можете предложить?

Возможный вариант: в обработчике сверять обновлено ли содержимое опции присланное от клиента, если да, обновляем по отдельности, а новые данные отмечать что их в базе нет и соответственно добавлять
  • Вопрос задан
  • 252 просмотра
Решения вопроса 2
egor_nullptr
@egor_nullptr
от этого растет autoincrement

bigint закончится очень нескоро

в случае ошибки можно просто напросто затереть данные, а не обновить и добавить

используйте транзакции:
begin;
delete from `options` where `product_id` = 123;
insert into `options` (`name`, ...) values ('opt1', ...), ('opt2', ...);
commit;
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
UPDATE `properties` SET `updated`  = 0 WHERE `item_id` = :itemId;
INSERT INTO `properties` (`item_id`, `property_id`, `value`, `updated`) 
  VALUES (:itemId, :propertyId, :propertyValue, 1)
  ON DUPLICATE KEY UPDATE `value` = VALUES(`value`), `updated` = 1;
...
DELETE FROM `properties` WHERE `item_id` = :itemId AND `updated` = 0;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы