带有更新+插入的MySQL LOAD DATA INFILE问题

时间:2012-10-03 23:34:53

标签: mysql import

我得到了一个结构相当差的表,其主键设置为自动增量,而UNIQUE键只是唯一的。从概念上讲,UNIQUE键应该是主键,但是制作表的人在表构造时没有UNQIUE键的列信息。

现在,我们需要开始定期更新此表,其中提供的文本文件包含更新的行和新行。如果UNIQUE键中存在匹配值,那么挑战就是替换行,只要它自动增量,我们实际上并不关心主键本身。

然而,LOAD DATA INFILE的结构方式是它重置了我们已经拥有的PK,这很糟糕 - 我们保留PK的原因是它是其他遗留表的外键(Sigh ... )。

那么......有没有办法可以制作一个优雅的SQL更新脚本,以文本形式读取更新的表格,只是根据UNIQUE键列进行更新,而不会搞砸PK?

我想解决方案是将表导出到制表符表单并执行VLOOKUP以分配具有匹配PK值的行(如果是新行,则为NULL)。

任何输入?

编辑:有人建议我将LOAD DATE INFILE加载到临时表中,然后从那里执行INSERT / UPDATE。基于this post和该帖子所说的,这是我建议的脚本:

// Create temporary table
CREATE TABLE tmp {
// my specifications
}

// Load into temporary table
LOAD DATA LOCAL INFILE *'[my tab file]'* 
REPLACE INTO TABLE *mytable* FIELDS TERMINATED BY '\t' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

// Set copy all the columns over except the PK column. This is for rows with existing UNIQUE values
UPDATE mytable
RIGHT JOIN tmp ON mytable.unique = tmp.unique
SET mytable.col1 = tmp.col1, ..., mytable.coln = tmp.coln, mytable.unique = tmp.unique;

// Now insert the rows with new UNIQUE values
INSERT IGNORE INTO mytable (mytable.col1, mytable.col2, ...)
SELECT tmp.col1, tmp.col2, ... FROM tmp

// Delete the temporary table now.
DROP tmp;

Edit2:我更新了上面的查询并对其进行了测试。它应该工作。有什么意见吗?

1 个答案:

答案 0 :(得分:0)

您可以使用LOAD DATA INFILE将数据加载到新表中。然后使用INSERT,UPDATE语句用新表中的数据更改表,在这种情况下,您可以根据需要链接表 - 通过主键/唯一键或任何字段。