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