В процессе заполнения атрибутов в Списке товаров модуля получается, что у товара создается один и тот же атрибут с двумя разными значениями. Одно значение пустое, второе - соответствует выбранном. Порядок действий был таким:
1) Выбрали в выпадающем списке атрибут
2) Выбрали в выпадающем списке значение
На сайте это выглядело вот так:

Решение:
В модуле версий 1.10.0 - 1.12.0.I при редактировании значений атрибутов использовался запрос ON DUPLICATE KEY UPDATE
Но, оказалось, что у пользователя в структуре таблицы `product_attribute` не было первичных ключей `attribute_id`, `language_id`.
Структура таблицы при экспорте была:
CREATE TABLE `oc_product_attribute` (
`product_id` int(11) NOT NULL,
`attribute_id` int(11) NOT NULL,
`language_id` int(11) NOT NULL,
`text` text NOT NULL,
KEY `attribute_id` (`attribute_id`),
KEY `language_id` (`language_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Тогда как при установке выполняется:
CREATE TABLE `oc_product_attribute` (
`product_id` int(11) NOT NULL,
`attribute_id` int(11) NOT NULL,
`language_id` int(11) NOT NULL,
`text` text NOT NULL,
PRIMARY KEY (`product_id`,`attribute_id`,`language_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
Версия сервера базы данных: MySQL 5.7.21
Пробовал у себя (10.5.12-MariaDB) также создавать таблицу InnoDB, и у меня это не повлияло на наличие первичных ключей.
Попробовал создать клиенту клон таблицы из установочного файла OpenCart, и сработало ок: первичные ключи создались, тип таблицы был MyISAM.
Попробовал создать еще один клон таблицы на сервере клиента, но с типом InnoDB, в результате был создана таблица с первичными ключами. То есть, грешить на окружение нет смысла.
#задваивание, #дубли, #атрибуты, #атрибутов