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

问题描述 投票:0回答:2

嗨,我在使用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

没有语法错误,但不更改任何行,不知道为什么。

mysql sql random
2个回答
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


0
投票

在查询中,您可能认为这:

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

© www.soinside.com 2019 - 2024. All rights reserved.