带有随机唯一数字的UPDATE SQL表

嗨,我在使用SQL UPDATE时遇到了麻烦。我想从0-2到表草稿中的列草稿中插入随机唯一数字(其中列大厅为1)。

我有这个,但是它以错误结尾:#1093-您无法在FROM子句中指定目标表“草稿”进行更新

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

不会出现语法错误,但不会更改任何行,也不知道为什么。

beibei0524 回答:带有随机唯一数字的UPDATE SQL表

您可以这样做:

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列将使用0-2范围内的3个唯一随机整数进行更新。
请参见demo

本文链接:https://www.f2er.com/3169919.html

大家都在问