用MySQL删除双行

时间:2015-02-06 09:18:05

标签: mysql

起初,我非常怀疑之前没有人问过这个问题,但我所看到的所有答案都指向了数据库中的一个双重列。我有两个。

示例数据:

ID | identifier | meta_key  | meta_value
1  | abc1234    | name      | Niels
2  | abc1234    | name      | Niels
3  | abc1234    | last_name | van R
4  | abc1234    | city      | New York
5  | abc1234    | city      | New York

现在,我想运行一个查询(在本例中为每日),该查询通过数据库并删除所有的错误,在这种情况下是具有匹配标识符和meta_keys的行。每个标识符meta_key在查询后应该是唯一的,应该保存具有最高ID的记录。查询后的示例数据

ID | identifier | meta_key  | meta_value
2  | abc1234    | name      | Niels
3  | abc1234    | last_name | van R
5  | abc1234    | city      | New York

谁能指出我正确的方向?

1 个答案:

答案 0 :(得分:0)

理论上你可以这样写:

DELETE FROM yourtable WHERE EXISTS(
    SELECT 'OTHER'
    FROM yourtable t2
    WHERE t2.identifier = yourtable.identifier
    AND t2.meta_key = yourtable.meta_key
    AND t2.meta_value = yourtable.meta_value
    AND t2.id > yourtable.id)

但在MySql中,不可能在DELETE和内部子查询上使用相同的表,因此您需要使用这样的临时表:

第一步:

CREATE TEMPORARY TABLE duplicated
(id int)

INSERT INTO duplited (id)
SELECT t1.id
FROM yourtable t1
WHERE EXISTS(
    SELECT 'OTHER'
    FROM yourtable t2
    WHERE t2.identifier = t1.identifier
    AND t2.meta_key = t1.meta_key
    AND t2.meta_value = t1.meta_value
    AND t2.id > t1.id)

第二步:

DELETE FROM yourtable WHERE id in (SELECT id FROM duplicated)

注意:更好的方法是使用替代密钥防止重复行,例如,您可以添加关于三个字段标识符,meta_key,meta_value的唯一约束;像这样:

ALTER TABLE yourtable ADD UNIQUE (identifier, meta_key, meta_value)