如果没有完成,Mysql将删除具有相同ID的所有记录

时间:2017-02-15 13:01:33

标签: mysql

让我解释一下我的问题,这是我的表

Statuses           | RESPONSEOID

Solicita Despacho   4432
Despachado          4432
En Camino           4432
En el Lugar         4432
Terminado           4432
Finalizado          4432
Solicita Despacho   0224
Despachado          0224
En el Lugar         0224
Solicita Despacho   5585
Despachado          5585
En Camino           5585
En el Lugar         5585
En el Lugar         5585
Terminado           5585
Finalizado          5585
Solicita Despacho   1824
Despachado          1824
En Camino           1824
En el Lugar         1824
Solicita Despacho   4688
Terminado           4688
Finalizado          4688
Solicita Despacho   1430
Despachado          1430
Terminado           1430
Finalizado          1430

所以这是一个包含EVENTS的表(例如,ID 4432只是一个具有许多状态的事件)

在我的脑海里,我需要解决2个问题,

1)我必须删除没有状态Finalizado(已完成)的所有事件(包括所有状态和行)

2)我必须删除具有重复状态的所有事件(包括所有状态和行)

所以在上面的例子中,我将不得不删除所有记录,其中responseoid = 0224和1824表示问题一,而responseoid = 5585表示问题二

但请考虑该表有11500000行aprox。

我不在乎这是一个或两个查询的可能性

提前致谢

4 个答案:

答案 0 :(得分:1)

对于第一项任务,请尝试此查询 -

INSERT INTO temp_table SELECT DISTINCT * FROM table;

对于第二个,你应该重新填充表 -

\n

如果有ID字段,则可以删除重复项而无需重新填充。

答案 1 :(得分:1)

1)您需要提供具有Finalizado值的第一个ID列表,并使用 NOT IN 删除其他ID

 delete from tableName where RESPONSEOID NOT IN (select a.ids from 
(select RESPONSEOID as ids from tableName where Statuses='Finalizado' 
) a)

2)删除重复的

ALTER IGNORE TABLE table_name
  ADD UNIQUE INDEX all_columns_uq
    (RESPONSEOID, Statuses) ;

注意:首先在临时表上尝试这一点,确保所有内容都比在原始表上使用正确

答案 2 :(得分:0)

是的,您可以通过查询

来完成
  1. 回答你的第一部分

    delete from table 
    where statuses NOT IN ('Finalizado')
    
  2. 回答你的第二部分是:为字段添加唯一约束,它将删除所有重复的条目,如:

    ALTER IGNORE TABLE your_table
        ADD UNIQUE INDEX idx_name (statuees);   // you can pass multiple fields name comma-separated
    

答案 3 :(得分:0)

保留最高ID:

DELETE t1 FROM `users` t1, `users` t2 WHERE t1.id < t2.id AND t1.name = t2.name

保持最低ID:

DELETE t1 FROM `users` t1, `users` t2 WHERE t1.id > t2.id AND t1.name = t2.name