如何在多个MySQL语句中使用限制选择唯一记录

时间:2012-03-31 11:23:42

标签: php mysql

我有10个单独的php chron作业运行,使用

从同一个表中一次选择100条记录
SELECT `username` FROM `data` where `id` <> = '' limit 0,100

如何确保每个记录集都是唯一的?有没有办法确保每个chron作业不会选择相同的100条记录?

如果有帮助,

用户名是唯一的。

由于

乔纳森

2 个答案:

答案 0 :(得分:2)

  • 您可以选择不同的100条记录:

    limit 100,100limit 200,100 ...

  • 或随机选择100:

    ...FROM的数据where ID为<> = '' ORDER BY RAND() LIMIT 0,100

  • 如果您想确保不会选择两次记录,则必须标记该记录(“使其变脏”),以便其他cron作业只能查询非记录已经选择了。只需添加另一个名为chosen的布尔键,并在选择给定记录后将其标记为true。您必须逐个运行cron作业,或使用锁定或互斥机制来确保它们不会并行运行并相互竞争。

答案 1 :(得分:1)

你可以做的是'标记'每个工作将要使用的记录 - 诀窍是确保在标记它们时没有竞争条件。这是一种方法。

create table job
(
    job_id int not null auto_increment,
    #add any other fields for a job you might want
    primary key(job_id)
);

# add a job_id column to data
alter table data add column job_id not null default '0', add index(job_id);

现在,当您想要处理100个数据行时,通过在作业中插入一行并获取自动生成的ID来获取唯一的job_id。以下是如何在mysql命令行客户端中执行此操作,以便轻松了解它如何适应代码:

insert into job (job_id) values(0);
set @myjob=last_insert_id();

然后,标记当前为0的一百行

update data set job_id=@myjob where job_id=0 limit 100;

现在,你可以花时间处理job_id = @ myjob所有的行,知识中没有其他进程可以触及它们。

毫无疑问,您需要根据自己的问题进行定制,但这说明了如何使用MySQL的简单功能来避免竞争访问相同记录的并行进程中的竞争条件。