0

我在 MySQL 中有一个名为 word 的仅插入表。一旦行数超过 1000000,我想删除表的前 100000 行。

我在python中使用mysqldb,所以我有一个全局变量:

wordcount = cursor.execute("select * from word")

将在 python 环境中返回表中的行数。然后,每次插入新行时,我都会将 wordcount 增加 1。然后我检查行数是否大于1000000,如果是,我想删除前100000行:

if wordcount > 1000000:
    cursor.execute("delete from word limit 100000")

我从这个线程得到了这个想法: 删除数据库的前 X 行

但是,这个 SQL 结束了删除我的整个表,我在这里缺少什么?

谢谢你。

4

2 回答 2

0

如果您的表“单词”有 ID 字段(键 auto_increment 字段),您可以编写一些删除前 100000 行的存储过程。存储过程的关键部分是:

drop temporary table if exists tt_ids;
create temporary table tt_ids (id int not null);

insert into tt_ids -- taking first 100000 rows
select id from word
order by ID
limit 100000;

delete w
from word w
join tt_ids ids on w.ID = ids.ID;

drop temporary table if exists tt_ids;

您也可以在 ID 字段上的 tt_ids 上建立一些索引,以加快查询速度。

于 2013-07-09T10:30:44.770 回答
0

我认为这不是获取行数的正确方法。您需要将语句更改为具有count(*)然后使用 MySQLs cursor.fetchone() 来获取结果的元组,其中第一个位置(有点像wordcount = cursor.fetchone()[0])将具有正确的行数。

您的删除语句看起来正确,也许您有明确的交易?在这种情况下,您必须commit()在删除后调用您的 db 对象。

于 2013-07-08T20:20:31.360 回答