找到所有NULL值并使用MySQL查询将它们设置为最低的未使用数字

时间:2015-07-14 12:01:00

标签: mysql sql join subquery

我想在列NULL中找到所有 parameter_id 将它们设置为最低未使用 {{ 1}}。

我有查询会找到最低的未使用parameter_id,我也知道如何获取parameter_id值的列表。

NULL

我可以使用SELECT MIN(t1.parameter_id)+1 FROM table AS t1 WHERE NOT EXISTS (SELECT * FROM table AS t2 WHERE t2.parameter_id = t1.parameter_id+1) 获取所有行的列表,然后进行查询以查找当前最低的未使用parameter_id=NULL,然后将parameter_id更新为最低未使用的数字。由于表有50.000行,这种方法会产生数千个查询(每行50.000 * 2)。

有没有办法运行“单个查询”,找到所有parameter_id并将它们全部更新为当前最低的未使用parameter_id=NULL

这是table decrtiption(MySQL 5.5):

parameter_id

示例数据:

id (INT) primary key, auto_increment
parameter_id (INT) default NULL

期望的结果:

# id, parameter_id
1, NULL
2, 1
3, NULL
4, 5
5, 3

修改

我提炼了我想要单一查询的内容。我只需要运行此查询,直到受到UPDATE影响的0行。

# id, parameter_id
1, 2
2, 1
3, 4
4, 5
5, 3

1 个答案:

答案 0 :(得分:1)

以下列举了未使用的参数ID:

select t.*, (@rn := @rn + 1) as seqnum
from table t cross join
     (select @rn := 0) params
where not exists (select 1 from table t2 where t2.parameter_id = t.id)
order by t.id;

(您可能希望将其放在seqnum的索引为临时表的后续查询中。)

问题是获取update的连接密钥。这是一个kludge:我要添加一个列,枚举它,然后删除它:

alter table `table` add column null_seqnum;

update `table` t cross join (select @rn1 := 0) params
    set null_seqnum = (@rn1 := @rn1 + 1)
    where parameter_id is null;

update `table` t join
       (select t.*, (@rn := @rn + 1) as seqnum
        from `table` t cross join
             (select @rn := 0) params
        where not exists (select 1 from `table` t2 where t2.parameter_id = t.id)
        order by t.id
       ) tnull
       on t.null_seqnum = tnull.seqnum
    set t.parameter_id = tnull.id;

alter table `table` drop column null_seqnum;