我想我知道问题是什么,但我需要一些正确方向的帮助。
我有一张桌子和产品,而且我还为各种供应商提供了几个临时产品表。
此处的目标是从相应的temp_product表更新products表中的多个字段。我的产品供应商向我提供了一份包含所有库存数据的CSV文件。最初我只是循环遍历CSV并逐行更新,但这需要永远,所以现在我使用LOAD DATA LOCAL INFILE将它加载到临时表中。
我遇到的问题是UPDATE查询需要永远运行,并且大多数时候MySQL完全崩溃。我希望我能告诉你我的表格结构,有人可以帮我解决哪种键/索引设置效果最好?
我尝试了两种不同的更新查询变体,但两者都没有工作。
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&#39 ;
感谢您的帮助!
编辑:稍微减少了问题,最初有一个产品和supplier_product表要更新,一旦我得到产品表工作,我可以从那里拿它。答案 0 :(得分:0)
首先,您可以运行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);
但在这种情况下,这意味着对于temp_product表中具有部分sku
的一条记录,您将更新product
表中的多条记录。
关于表大小:即使表很大(比如几百万行),但是运行需要花费大量时间的查询(例如,如果你是唯一一个使用这个数据库的人)也可以,那么在你之后添加了密钥,其中任何一个变体原则上都应该工作,并且花费的时间比现在花费的时间少。否则,您最好分批进行更新(例如,一次100,500或1000条记录),最好使用某些脚本,甚至可能在更新之间等待一段时间。如果您的数据库是复制到从属服务器的主数据库,则特别推荐使用此方法。