gpt4 book ai didi

php - 根据另一个表引用 ID 更新/插入大表记录。

转载 作者:行者123 更新时间:2023-11-29 19:28:50 26 4
gpt4 key购买 nike

我有一个内部库存系统,包含以下 3 个表格

a.股票 - 每日从 CSV 文件更新。

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

该表每天都会被截断,并从商家的 CSV 文件中导入新的股票数据。(大约 600 万条记录)

b. Cloths Master - 服装大师数据库

----------------------------------------
| 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更新Inventory表中的库存,如果Inventory表中不存在则需要添加该记录。

到目前为止我尝试过的是一个 PHP 脚本。A。首先,将 Inventory 表中所有记录的状态设置为 INACTIVE。b.对于stocks表中的每条记录,检查Cloths Master表中是否存在MODELNO。b.如果记录存在则获取ref_id,并检查ref_id是否存在于库存表中并相应地更新/插入记录。

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

您能否建议一种有效的方法来实现上述功能。

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

最佳答案

在这种情况下,我想到的问题是 - 为什么不使用触发器?

创建表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 后插入数据 - 您必须决定 - 但这个示例应该会给您一些见解。

触发器语句中的定义器必须更改为您的设置

关于php - 根据另一个表引用 ID 更新/插入大表记录。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41942462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com