如何在排除数字的同时找到范围内的随机数

时间:2014-01-24 20:03:19

标签: mysql sql

我目前正在使用主键的模数为服务器分配记录,这导致均匀分布。有时我需要关闭其中一台服务器,我不希望记录在离线时建立起来。

当前SQL

UPDATE table
SET server_id = ((primary_key % 10000) + 1)
WHERE server_id IS NULL; 

我试图避免第二个SQL语句,所以如果你有另一个想法,我很乐意听到它。

1 个答案:

答案 0 :(得分:1)

我认为您需要以下内容:

update table t join
       (select s.*, @rn := @rn + 1 as FakeServerNumber, NumServers
        from servers s cross join
             (select count(*) as NumServers, @rn := -1
              from servers
              where isup = 'isup'
             ) const
        where s.isup = 'isup'
       ) s 
       on t.primary_key % s.NumServer = s.rn
    set t.server_id = s.server_id
    where t.server_id is null;

这会为所有“up”服务器添加一个序列号。它将join用于主键上的模数表达式。然后,您可以将实际的服务器信息插入表中。