我得到了一个结构很差的表,它的主键设置为自动递增,唯一键也是唯一的。从概念上讲,唯一键应该是主键,但是无论是谁创建的表,在表构造时都没有UNQIUE键的列信息。
现在,我们需要开始对这个表进行常规更新,其中提供的文本文件包含更新的行和新行。如果唯一键中有匹配值,那么替换该行将是一个挑战,而我们实际上并不关心主键本身,只要它是自动递增的。
然而,LOAD DATA INFILE的结构方式是它会重置我们已经拥有的PK,这是不好的-我们保留PK的原因是它是其他遗留表的外键(叹息...)。
所以..。有没有一种方法可以创建一个优雅的纯SQL更新脚本,它以文本形式读取更新后的表,并且只根据唯一键列进行更新,而不会搞砸PK?
我想一个解决方案是将表导出到选项卡表单,并执行VLOOKUP来为行分配匹配的PK值(如果是新行,则为NULL )。
有什么建议吗?
编辑:有人建议我将DATE INFILE加载到一个临时表中,然后从那里执行插入/更新。根据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:我更新了上面的查询并对其进行了测试。应该能行得通。有什么意见吗?
发布于 2012-10-04 15:00:37
您可以使用load data INFILE将数据加载到新表中。然后使用INSERT、UPDATE语句使用新表中的数据更改您的表,在这种情况下,您可以根据需要链接表-通过主键/唯一键或任何字段。
https://stackoverflow.com/questions/12718352
复制相似问题