2017-01-30 52 views
0

我有一个内部库存系统,下面3个表格为根据另一个表引用ID更新/插入大型表记录。

a。股票 - 每日更新一个CSV文件。

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

每天这个表将被截断,新的股票数据从一个商人的CSV文件导入。(约6万条记录)

湾布大师 - 主衣服数据库

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

MODELNO是独一无二的,ref_id的主键。此表是内部库存应用程序的一部分(拥有大约450万条记录)

c。库存表 - 这是内部应用

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

此表存储产品中的可用库存的基础上,股票的部分,如果折扣,如果40%以上的产品是ACTIVE否则默认为INACTIVE

所需的功能是,我需要运行一个脚本,这个脚本可以循环存储表记录,并且MODELNO更新库存表上的库存,并且如果库存表中的记录不存在,那么它需要被添加。

我到现在为止所尝试的是一个PHP脚本。 a。首先,将Inventory表中所有记录的状态设置为INACTIVE。 b。对于库存表中的每个记录,检查布料主表中是否存在MODELNO。 b。如果记录存在,则获取ref_id,并检查相应的库存表和更新/插入记录中是否存在ref_id。

问题是脚本需要超过8个小时才能完成。

你能提出一个有效的方法,可以用来实现上述功能。

注意: 所有插入和更新到清单表使用CodeIgniter的批量插入/更新功能完成。 我将所有状态设置为INACTIVE,因为可能很少有产品不在库存数据库中。

+0

提示:请勿将“%”。 – Strawberry

+0

这样做,顺便说一句我已经使用Mysql Load Inline将CSV文件转储到数据库。还有MODELNO的索引,并且ref_id字段 – epynic

回答

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

谢谢,请尝试一下并回来,同时不会触发减慢插入? – epynic

+0

当然 - 但它们肯定比php查询更快 – sintakonte

相关问题