我在TableB(id)
中有一组值(不连续)我需要随机更新TableA中的列。
此查询会执行我想要的操作吗?
update TableA set column1 = (select id from TableB order by rand() limit 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;
两个子选择orderA
和orderB
添加了一个额外的列:rnA
和rnB
,这些列是从1开始的连续订单号。
连接条件要求这两者相等。这将使一条记录与TableA
中的至多一条记录匹配。由于TableB
首先按随机顺序重新排序,结果将是您所期望的结果。