我想在列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
答案 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;