我有一组值(不连续)在表B(编号)需要随机更新一列。但随机值列举
我需要用这些值随机更新TableA列。
这个查询会做我想要的吗?
update TableA set column1 = (select id from TableB order by rand() limit 1)
这是正确的方法吗?
我有一组值(不连续)在表B(编号)需要随机更新一列。但随机值列举
我需要用这些值随机更新TableA列。
这个查询会做我想要的吗?
update TableA set column1 = (select id from TableB order by rand() limit 1)
这是正确的方法吗?
关于你提出的声明:
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
首先按随机顺序重新排序,结果将是你所期望的。
非常感谢@trincot –
不客气。 – trincot
“TableA”的'Column1'中的当前值是什么?我用目前的方法看到的问题是,您最终可能会使用相同的值两次。 –
您当前的查询会将'TableA'中所有行中的所有'column1'字段设置为从'TableB'中随机选择的同一个'id'值。目前还不清楚这是否是你想要的 - 请澄清。 – Synchro
谢谢@Synchro我使用Mysql。所以它运行良好。它不填充相同的值。 –