Обновление / вставка больших записей таблицы на основе другого идентификатора таблицы.

У меня есть система внутренней инвентаризации с приведенными ниже 3 таблицами

а. Акции — Ежедневно обновляется из файла CSV.

---------------------------------
| id | MODELNO | Discount | MRP |
---------------------------------
| 1  | MODEL_1 | 40%      | 900 |
| 2  | MODEL_A | 20%      | 600 |
---------------------------------

Каждый день эта таблица усекается, и новые данные о запасах импортируются из CSV-файла продавца (около 6 миллионов записей).

б. Cloths Master — База данных мастерской одежды

----------------------------------------
| ref_id | MODELNO | Name        | MRP |
----------------------------------------
| 80      | MODEL_1 |Some Dress   | 900 |
| 81      | MODEL_A |Another Dress| 600 |
----------------------------------------

MODELNO уникален и ref_id первичный ключ. Эта таблица является частью внутреннего приложения Inventory (содержит около 4,5 миллионов записей)

с. Инвентарная таблица — это часть внутренних приложений

-------------------------------------------------
| id | ref_id  | Name        | MRP | status      |
-------------------------------------------------
| 1  | 80      |Some Dress   | 900 |   ACTIVE    |
| 2  | 81      |Another Dress| 600 |   INACTIVE  |
--------------------------------------------------

В этой таблице хранится доступный инвентарь для продукта, основанный на запасах, и если скидка превышает 40%, продукт ACTIVE еще по умолчанию INACTIVE,

Требуемая функциональность заключается в том, что каждый день мне нужно запускать скрипт, который бы циклически обрабатывал записи таблицы запасов, и для MODELNO обновите запас в таблице инвентаризации и, если запись в таблице инвентаризации не существует, то ее необходимо добавить.

То, что я пробовал до сих пор, это PHP-скрипт, который бы.
а. Во-первых, установите статус в таблице инвентаризации для всех записей как НЕАКТИВНЫЙ.
б. И для каждой из записей в таблице запасов проверьте, существует ли MODELNO в таблице Master Closs.
б. Если записи существуют, то получите ref_id и проверьте, существует ли ref_id в таблице инвентаризации и записи обновления / вставки соответственно.

Проблема в том, что выполнение сценария занимает более 8 часов.

Можете ли вы предложить эффективный способ, который может быть использован для реализации вышеуказанных функций.

Замечания :
Все вставки и обновление таблицы инвентаризации выполняются с помощью функции пакетной вставки / обновления CodeIgniter.
Я установил весь статус на НЕАКТИВНЫЙ, так как там может быть несколько продуктов, которых нет на складе БД.

0

Решение

В этом случае возникает вопрос: почему бы не использовать триггер?

Создать таблицу so_stocks

CREATE TABLE IF NOT EXISTS `so_stocks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`MODELNO` varchar(50) COLLATE uft8_general_ci NOT NULL DEFAULT '0',
`Discount` int(10) DEFAULT '0',
`MRP` int(11) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=uft8_general_ci;

INSERT INTO `so_stocks` (`id`, `MODELNO`, `Discount`, `MRP`) VALUES
(1, 'MODEL_1', 40, 900),
(2, 'MODEL_A', 20, 600);

Создать таблицу so_inventory

CREATE TABLE `so_inventory` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`ref_id` INT(11) NOT NULL DEFAULT '0',
`Name` VARCHAR(255) NOT NULL DEFAULT '0' COLLATE 'uft8_general_ci',
`MRP` INT(11) NOT NULL DEFAULT '0',
`status` TINYINT(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
)
COLLATE='uft8_general_ci'
ENGINE=MyISAM
AUTO_INCREMENT=1
;

И, наконец, таблица so_cloths

CREATE TABLE `so_cloths` (
`ref_id` INT(11) NOT NULL AUTO_INCREMENT,
`MODELNO` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'uft8_general_ci',
`Name` VARCHAR(255) NOT NULL DEFAULT '0' COLLATE 'uft8_general_ci',
`MRP` INT(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ref_id`)
)
COLLATE='uft8_general_ci'
ENGINE=MyISAM
AUTO_INCREMENT=1
;

А теперь триггер

CREATE DEFINER=`root`@`::1` TRIGGER `so_cloths_after_insert` AFTER INSERT ON `so_cloths` FOR EACH ROW BEGIN
INSERT INTO so_inventory (ref_id,Name,MRP,status)
select sc.ref_id,sc.Name, sc.MRP, if (ss.Discount >= 40, 1,0) AS active from so_cloths AS sc
LEFT JOIN so_stocks AS ss ON (sc.MODELNO = ss.MODELNO)
WHERE sc.ref_id = new.ref_id;
END

Каждый раз, когда вы вставляете что-то в so_cloths, вставка будет сделана в so_inventory.

Очевидно, это зависит от того, хотите ли вы вставить данные после вставки их в so_stocks или в so_cloths — вы сами должны это решить — но пример должен дать вам некоторое представление.

Определитель в выражении триггера должен быть изменен на ваши настройки

0

Другие решения

Других решений пока нет …