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

当前SQL

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


我正在尝试避免使用第二条SQL语句,因此,如果您有其他想法,我很想听听。

最佳答案

我认为您需要以下内容:

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;


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

关于mysql - 如何在排除数字的同时找到一个范围内的随机数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21341488/

10-11 04:32