嗨,我在使用SQL UPDATE时遇到了麻烦。我想从0-2到表草稿中的列草稿中插入随机唯一数字(其中列大厅为1)。
我有这个,但是它以错误结尾:#1093-您不能在FROM子句中指定目标表'draft'进行更新
UPDATE draft
SET draft = (
SELECT FLOOR(RAND() * 3) AS random_num
WHERE "random_num" NOT IN (
SELECT draft FROM draft
)
)
WHERE lobby = 1
RAND范围将在应用程序级别上动态生成,因此结果应如下所示:3条记录=唯一的随机0-2,9条记录=唯一的数字从0-8等]
开始
ID DRAFT LOBBY
1 null 1
2 null 1
3 null 1
结果
ID DRAFT LOBBY
1 1 1
2 2 1
3 0 1
请帮助吗?
我将查询更新为此:
UPDATE draft
SET draft = (
SELECT FLOOR(RAND() * 3) AS random_num
WHERE "random_num" NOT IN (SELECT draft FROM (SELECT * FROM draft) AS temp)
)
WHERE lobby = 1
没有语法错误,但不更改任何行,不知道为什么。
您可以做:
update draft d cross join
(select n.*
from (select 0 as n union all select 1 as n union all select 2) n
where n.n not in (select d2.draft from draft d2)
order by rand()
limit 1
) n
set d.random_number = n.n
where d.lobby = 1
limit 1;
注意limit 1
。这使您可以一次更新一行。如果满足多个行的条件,则应使用适当的过滤条件重复update
。
在查询中,您可能认为这:
WHERE "random_num" NOT IN...
将random_num
列与IN之后的值进行比较,但不是这种情况。为什么?因为无法在WHERE子句中使用像random_num
这样的计算列它正在做的是比较字符串"random_num"
,该字符串被转换为0
,以执行比较。如果id
是3个连续的整数(如您的样本数据),这将起作用:
update draft d cross join (
select group_concat(t.x order by rand() separator '') col
from (select 0 x union all select 1 union all select 2) t
) r
set d.draft = substr(r.col, d.id % 3 + 1, 1)
where d.lobby = 1;
draft
列将使用3个在0-2
范围内的唯一随机整数进行更新。参见demo。