2017-01-30 57 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

相關問題