我有一个庞大的Firebird数据库,其中一个表有4100万行。最近我添加了一个新的浮点列,并希望用增量数据填充它。每个下一个值应该是先前增加RAND()
。第一个值也是RAND()
。
怎么做?
查询
SELECT ID FROM MY_TABLE WHERE MY_COLUMN IS NULL ROWS 1;
最多需要15秒,因此我不会指望在循环中执行此查询。
该表有一个索引ID列,它是复合主键的一部分。
答案 0 :(得分:0)
类似
update MyTable set MyColumn = Gen_ID( TempGen,
round( rand() * 100000) ) / 100000.0
或者使用存储过程或EXECUTE BLOCK
类似
execute block
as
declare f double precision = 0;
declare i int;
begin
for select ID FROM MY_TABLE WHERE MY_COLUMN IS NULL order by id into :I
do begin
f = f + rand();
update MY_TABLE SET MY_COLUMN = :f where ID = :i;
end;
end
或者您可以尝试使用游标,但我没有尝试,所以我不确定它是如何工作的。
https://www.firebirdsql.org/refdocs/langrefupd25-psql-forselect.html
execute block
as
declare f double precision = 0;
begin
for select ID FROM MY_TABLE WHERE MY_COLUMN IS NULL order by id
as cursor C do begin
f = f + rand();
update MY_TABLE SET MY_COLUMN = :f where current of C;
end;
end