У меня есть система внутренней инвентаризации с приведенными ниже 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.
Я установил весь статус на НЕАКТИВНЫЙ, так как там может быть несколько продуктов, которых нет на складе БД.
В этом случае возникает вопрос: почему бы не использовать триггер?
Создать таблицу 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 — вы сами должны это решить — но пример должен дать вам некоторое представление.
Определитель в выражении триггера должен быть изменен на ваши настройки
Других решений пока нет …