需要随机更新列。但是列举了随机值

时间:2016-08-04 12:53:14

标签: mysql sql

我在TableB(id)

中有一组值(不连续)

我需要随机更新TableA中的列。

此查询会执行我想要的操作吗?

update TableA set column1 = (select id from TableB order by rand() limit 1)

这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

关于你提出的陈述:

update TableA set column1 = (select id from TableB order by rand() limit 1)

它的行为有点不可预测。我希望它只运行一次子查询,然后使用它提供的值更新TableA的所有行,但显然MySql 运行每个记录的子查询tableA

但是,您仍会将TableB的某些值分配给多行TableA。如果你不希望这种情况发生,那就变得更加复杂了。

如果您的TableA有一个唯一的id字段,我建议您这样做:

update     TableA 
inner join (select id, @rnA := @rnA + 1 as rnA
            from   TableA, 
                   (select @rnA := 0) init
           ) orderA
        on TableA.id = orderA.id   
inner join (select id, @rnB := @rnB + 1 as rnB
            from   (select * from TableB order by rand()) randB, 
                   (select @rnB := 0) init
           ) orderB
        on rnB = rnA          
set        TableA.column1 = orderB.id;

两个子选择orderAorderB添加了一个额外的列:rnArnB,这些列是从1开始的连续订单号。

连接条件要求这两者相等。这将使一条记录与TableA中的至多一条记录匹配。由于TableB首先按随机顺序重新排序,结果将是您所期望的结果。