我有一个内部库存系统,下面有3个表
一个。股票 - 每日从CSV文件更新。
---------------------------------
| id | MODELNO | Discount | MRP |
---------------------------------
| 1 | MODEL_1 | 40% | 900 |
| 2 | MODEL_A | 20% | 600 |
---------------------------------
每天都会截断此表格,并从商家的CSV文件中导入新的股票数据。(约600万条记录)
湾Cloths Master - 主衣服数据库
----------------------------------------
| ref_id | MODELNO | Name | MRP |
----------------------------------------
| 80 | MODEL_1 |Some Dress | 900 |
| 81 | MODEL_A |Another Dress| 600 |
----------------------------------------
MODELNO
是唯一的,ref_id
是主键。此表是内部库存应用程序的一部分(具有约450万条记录)
℃。库存表 - 它是内部应用程序的一部分
-------------------------------------------------
| id | ref_id | Name | MRP | status |
-------------------------------------------------
| 1 | 80 |Some Dress | 900 | ACTIVE |
| 2 | 81 |Another Dress| 600 | INACTIVE |
--------------------------------------------------
此表根据库存存储产品的可用库存,如果超过40%的折扣,产品默认为ACTIVE
,则为INACTIVE
。
所需的功能是每天我需要运行一个循环遍历库存表记录的脚本,并且MODELNO
更新库存表上的库存,如果库存表中的记录不存在则它需要添加。
我到目前为止所尝试的是一个PHP脚本。 一个。首先,在Inventory表中将所有记录的状态设置为INACTIVE。 湾并且对于库存表中的每个记录,检查Cloths Master表中是否存在MODELNO。 湾如果记录存在,则获取ref_id,并相应地检查库存表和更新/插入记录中是否存在ref_id。
问题是该脚本需要8个以上的小时才能完成。
您能否建议一种有效的方法,可以用来实现上述功能。
注意: 所有插入和更新到Inventory表都是使用CodeIgniter的批量插入/更新功能完成的。 我将所有状态设置为INACTIVE,因为可能没有少量产品存在于Stock DB中。
答案 0 :(得分: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之后插入数据 - 您必须自行决定 - 但该示例应该为您提供一些见解。
触发器语句中的定义者必须更改为您的设置