3

我正在使用mysql + php。php 提供了将 XLSX 商品表导入 Mysql 表的接口。我正在使用一个临时表,CREATE TABLE LIKE即在与实时表合并之前使用实时表的空克隆进行用户评估

我习惯于INSERT INTO finalTable SELECT * FROM importTable ON DUPLICATE KEY UPDATE ....避免INSERT每条记录。要在重复键上更新的字段由 php 确定,SHOW COLUMNS即临时表中的所有列。

我的问题是 XLSX 不一定包含所有字段(名称、价格、类别),即它可能只是对现有记录的更新。当前方法将更新所有字段,无论它们是否在导入期间设置,即如果 XLSX 仅包含价格更新,则其余字段为空,并将覆盖当前值。

我通过删除所有行都为空的列(不是行!)来更改临时表。这样,SHOW COLUMNS将只返回可更新的列。如果需要将字段归零,则可以轻松设置特殊值,例如“!X!” 并使用单个UPDATE句子来做到这一点。

有没有办法解决这个问题,或者你有什么更好的建议(我ON DUPLICATE KEY也愿意放弃)?

4

1 回答 1

3

我对你的问题有点困惑。

我正在使用 INSERT ... ON DUPLICATE KEY UPDATE 来避免每条记录都插入。

就像它说的那样,它插入或更新,你不会避免任何事情。如果你想避免插入使用INSERT IGNORE.

如果我是你,我会分两步合并表格。

第一步,插入(只是必要的):

INSERT INTO finalTable (col1, col2, ...)
SELECT i.col1, i.col2
FROM importTable i 
LEFT JOIN finalTable f  ON i.ID = f.ID
WHERE f.ID IS NULL;

第二步,更新:

我不明白,为什么要删除列。可能需要一段时间的不必要步骤,最重要的是,如果导入表中NULL只有几行,则更新问题仍然存在。NULL所以,这就是解决方案。

UPDATE finalTable f
INNER JOIN importTable i ON f.ID = i.ID
SET f.col1 = COALESCE(i.col1, f.col1),
f.col2 = COALESCE(i.col2, f.col2),
...;

第二步的诀窍是,使用COALESCE(). 此函数返回其第一个不为空的参数。因此,如果您的导入表中有一个为空的列,则最终表中的值将保持不变。

更新:

如果你坚持只有一个陈述,你当然可以

INSERT INTO final f
SELECT * FROM import i
ON DUPLICATE KEY UPDATE
SET f.col1 = COALESCE(i.col1, f.col1),
f.col2 = COALESCE(i.col2, f.col2),
...;
于 2013-06-07T10:10:57.567 回答