开发者

How to delete every record after the nth row in mysql?

In mysql I can query select * ... LIMIT 10, 30开发者_JAVA百科 where 10 represents the number of records to skip.

Does anyone know how I can do the same thing in delete statements where every record after the first 10 records get deleted?


Considering there is no rowId in MySQL (like in Oracle), I would suggest the following:

alter table mytable add id int unique auto_increment not null;

This will automatically number your rows in the order of a select statement without conditions or order-by.

select * from mytable;

Then, after checking the order is consistent with your needs (and maybe a dump of the table)

delete from mytable where id > 10;

Finally, you may want to remove that field

alter table mytable drop id;


The following will NOT work:

DELETE 
FROM table_name 
WHERE id IN
  ( SELECT id
    FROM table_name
    ORDER BY          --- whatever
    LIMIT 10, 30
  ) 

But this will:

DELETE 
FROM table_name 
WHERE id IN
  ( SELECT id
    FROM 
      ( SELECT id
        FROM table_name
        ORDER BY          --- whatever
        LIMIT 10, 30
      ) AS tmp
  ) 

And this too:

DELETE table_name 
FROM table_name 
  JOIN
    ( SELECT id
      FROM table_name
      ORDER BY          --- whatever
      LIMIT 10, 30
    ) AS tmp
    ON tmp.id = table_name.id 


When deleting a lot of rows, this is an efficient trick:

CREATE TABLE new LIKE real;   -- empty table with same schema
INSERT INTO new SELECT * FROM real ... LIMIT 10;  -- copy the rows to _keep_
RENAME TABLE real TO old, new TO real;  -- rearrange
DROP TABLE old;  -- clean up.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜