我得到了一个结构相当糟糕的表,它的主键设置为自动增量,而唯一键是唯一的。从概念上讲,UNIQUE 键应该是主键,但是建表的人在建表时并没有 UNQIUE 键的列信息。
现在,我们需要开始定期更新此表,其中提供的文本文件包含更新的行和新行。如果 UNIQUE 键中有匹配的值,那么挑战将是替换该行,并且我们实际上并不关心主键本身,只要它自动递增。
但是, LOAD DATA INFILE 的结构方式是它会重置我们已经拥有的 PK,这很糟糕 - 我们保留 PK 的原因是它是其他遗留表的外键(叹息......)。
那么......有没有办法可以制作一个优雅的仅限 SQL 的更新脚本,以文本形式读取更新的表,并仅基于 UNIQUE 键列进行更新,而不会搞砸 PK?
我想一个解决方案是将表导出到选项卡表单并执行 VLOOKUP 以分配具有匹配 PK 值的行(如果是新行,则为 NULL)。
有输入吗?
编辑:有人建议我将 LOAD DATE INFILE 加载到临时表中,然后从那里执行 INSERT/UPDATE。根据这篇文章和那篇文章所说的,这是我建议的脚本:
// 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:我更新了上述查询并对其进行了测试。它应该工作。有什么意见吗?