0

我有一个包含很多条目的 MySQL 表。它有一个定义为 (state, source) 的唯一键,因此该列组合没有重复项。但是现在我意识到大部分状态数据都没有一致地输入。例如,在某些行中,它被输入为“CA”,而在其他行中,它可能被拼写为“California”。

我想将所有说“加利福尼亚”的条目更新为“CA”,如果它在唯一键中产生冲突,请删除该行。我怎样才能做到这一点?

4

2 回答 2

1

您最好转储数据并使用Google Refine等外部工具进行清理。考虑将来使用外键来避免这些问题。

于 2012-04-20T16:17:48.423 回答
0

我不认为你可以在一个 SQL 语句中做到这一点。如果你有从其他表到你试图清理的表的外键关系,那么你肯定不想一步完成(即使你可以)。

CREATE TABLE state_mappings (
    `old` VARCHAR(64) NOT NULL,
    `new` VARCHAR(64) NOT NULL
);

INSERT INTO state_mappings VALUES ('California', 'CA'), ...;

INSERT IGNORE INTO MyTable (state, source)
    SELECT sm.new, s.source from states s JOIN state_mappings sm
        ON s.state = sm.old;

// Update tables with foreign keys here

DELETE FROm MyTable WHERE state IN (SELECT distinct old FROM state_mappings);
DROP TABLE state_mappings;

我不是 SQL 专家,所以这些语句可能可以优化,但你明白了要点。

于 2012-04-20T16:34:52.290 回答