【问题标题】:UPDATE SQL Table with random unique numbers更新具有随机唯一数字的 SQL 表
【发布时间】:2019-11-03 22:21:58
【问题描述】:

您好,我遇到了 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

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

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。请提供样本数据和期望的结果。三个随机数并没有给你太多选择。
  • 您要解决的问题是持久化到数据库中的随机排序顺序还是类似的东西?听起来你想反过来做,即将所有记录初始化为空,update draft set draft = THENUMBER where draft IS NOT NULL ORDER BY RAND() LIMIT 1 - 在一个循环中

标签: mysql sql random


【解决方案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

【讨论】:

    【解决方案2】:

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

    WHERE "random_num" NOT IN...
    

    random_num 列与 IN 之后的值进行比较,但事实并非如此。
    为什么?因为像 random_num 这样的计算列不能在 WHERE 子句中使用
    它所做的是比较字符串"random_num",该字符串转换为0,以便执行比较。

    如果ids 是(如您的示例数据)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

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2021-06-27
      相关资源
      最近更新 更多