MYSQL非规范化数据查找和删除重复项

时间:2013-09-13 14:15:19

标签: mysql

我有示例数据

ID DAY ORDER TIME PRODUCT
 1   1    1    1     1 
 2   1    1    1     2
 3   1    1    1     3
 4   1    2    2     1
 5   1    2    2     2
 6   1    2    2     3
 7   1    2    *3*   1
 8   1    2    *3*   2
 9   1    2    *3*   3

我想防止在同一天的不同时间有多个订单。如果我在DAY,ORDER,TIME上设置唯一索引,我无论如何都无法插入多个时间,但我想禁用多个不同的TIME。这可以用mysql吗?

我可以找到同一天和ORDER中有多个不同TIME值的所有记录并删除它们吗?

在这种情况下,我想删除带有SQL查询的记录7,8和9,因为它是重复的ORDER插入。

我不想规范化表格我会坚持使用这个数据库结构。

非常感谢

2 个答案:

答案 0 :(得分:0)

您可以将deletejoin子句一起使用来查找重复项并删除它们:

delete
    from t join
         (select day, "order", min(time) as tokeeptime
          from t
          group by day, "order"
         ) tokeep
         on t.day = tokeep.day and t."order" = tokeep."order" and t.time <> tokeeptime;

答案 1 :(得分:0)

DELETE  a
FROM    tableName a
        INNER JOIN
        (
            SELECT  a.DAY, a.ORDER, MAX(a.TIME) Time
            FROM    tableName a
            GROUP   BY a.DAY, a.ORDER
            HAVING  COUNT(DISTINCT TIME) > 1
        ) b ON a.DAY = b.DAY AND
                a.Order = b.Order AND
                a.Time = b.Time