我得到了一个结构相当差的表,其主键设置为自动增量,而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:我更新了上面的查询并对其进行了测试。它应该工作。有什么意见吗?
答案 0 :(得分:0)
您可以使用LOAD DATA INFILE将数据加载到新表中。然后使用INSERT,UPDATE语句用新表中的数据更改表,在这种情况下,您可以根据需要链接表 - 通过主键/唯一键或任何字段。