我有一个包含很多条目的 MySQL 表。它有一个定义为 (state, source) 的唯一键,因此该列组合没有重复项。但是现在我意识到大部分状态数据都没有一致地输入。例如,在某些行中,它被输入为“CA”,而在其他行中,它可能被拼写为“California”。
我想将所有说“加利福尼亚”的条目更新为“CA”,如果它在唯一键中产生冲突,请删除该行。我怎样才能做到这一点?
我有一个包含很多条目的 MySQL 表。它有一个定义为 (state, source) 的唯一键,因此该列组合没有重复项。但是现在我意识到大部分状态数据都没有一致地输入。例如,在某些行中,它被输入为“CA”,而在其他行中,它可能被拼写为“California”。
我想将所有说“加利福尼亚”的条目更新为“CA”,如果它在唯一键中产生冲突,请删除该行。我怎样才能做到这一点?
您最好转储数据并使用Google Refine等外部工具进行清理。考虑将来使用外键来避免这些问题。
我不认为你可以在一个 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 专家,所以这些语句可能可以优化,但你明白了要点。