我想我知道问题出在哪里,但我需要一些帮助,朝着正确的方向发展。
我有一个表“产品”,也有几个temp_product表,用于各种供应商。
这里的目标是从适当的temp_product表中更新产品表中的几个字段。我的产品供应商给了我一个包含所有库存数据的CSV文件。最初,我只是循环浏览CSV并逐行更新,但这花了很长时间,所以现在我使用LOAD DATA LOCAL INFILE将其加载到临时表中。
我遇到的问题是UPDATE查询要永远运行,而且大多数时候MySQL完全崩溃了。我希望可以向您展示我的表结构,并且有人可以帮助我确定哪种键/索引设置最有效?
我尝试了2种不同的更新查询变体,但没有一种起作用。
UPDATE product AS p, temp_product AS t
SET p.quantity = t.quantity,
p.ean = t.inventory,
p.cost = t.price,
p.date_modified = NOW()
WHERE p.sku = t.sku
-和-
UPDATE temp_product AS t
INNER JOIN product AS p ON p.sku = t.sku
SET p.quantity = t.quantity,
p.ean = t.inventory,
p.cost = t.price,
p.date_modified = NOW()
这是我所讨论的表的结构:
temp_product
sku varchar(15) PRI
status varchar(2)
statusid int(11)
quantity int(11)
inventory varchar(15)
ETA varchar(25)
ETA_Note varchar(255)
price double(10,2)
产品
product_id int(11) PRI
model varchar(64)
sku varchar(64)
upc varchar(50)
ean varchar(50)
mpn varchar(64)
location varchar(128)
quantity int(4)
price decimal(15,4)
cost decimal(15,4)
status tinyint(1)
date_added datetime
date_modified datetime
我有一种感觉,如果我正确设置了键/索引,我可以使它正常工作。我现在唯一设置的是主键,但是这些键在所有表中都不匹配。我对所有这些都还很陌生,因此我们将不胜感激。
为了使事情变得更加复杂,我不确定某些供应商是否使用相同的SKU,因此我想更新产品表WHERE sku = sku和location ='suppliername'。
谢谢您的帮助!
编辑:减少了一点点的问题,最初有一个要更新的产品和Supplier_product表,一旦我使产品表工作,我可能可以从那里拿走它。
首先,你可以运行SHOW CREATE TABLE product;
和SHOW CREATE TABLE temp_product;
粘贴的结果?另外,您的产品表到底有多大?(select count(1) from products
可以提供帮助)
关于键:您至少需要sku
向product
表中添加键。
如果sku
应该是唯一字段,则可以使用以下命令进行操作:
ALTER TABLE product ADD UNIQUE KEY sku(sku);
如果sku
不是唯一字段,那么您仍然可以像这样将其添加为键:
ALTER TABLE product ADD KEY sku(sku);
但是在这种情况下,这意味着对于sku
temp_product表中包含特定记录的一条记录,您将更新表中的多个记录product
。
关于表的大小:即使表很大(例如几百万行),也可以运行耗时的查询(例如,如果您是唯一使用此数据库的人),则在添加表之后关键是,这两种变体原则上都应该可以工作,并且所花的时间比现在少。否则,最好分批进行更新(例如一次进行100、500或1000条记录),最好使用一些脚本,这些脚本甚至可能在更新之间稍等一会。如果您的数据库是复制到从属服务器的主数据库,则特别推荐这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句