0

我得到了一个结构相当糟糕的表,它的主键设置为自动增量,而唯一键是唯一的。从概念上讲,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:我更新了上述查询并对其进行了测试。它应该工作。有什么意见吗?

4

1 回答 1

0

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

于 2012-10-04T07:00:37.190 回答