我有一个巨大的 Firebird 数据库,其中包含一个包含 4100 万行的表。最近我添加了一个新的浮点列,并想用增量数据填充它。每个下一个值都应该是前一个值增加RAND()
. 第一个值也是RAND()
。
这个怎么做?
查询
SELECT ID FROM MY_TABLE WHERE MY_COLUMN IS NULL ROWS 1;
最多需要 15 秒,所以我不会指望这个查询在循环中执行。
该表有一个索引 ID 列,它是复合主键的一部分。
我有一个巨大的 Firebird 数据库,其中包含一个包含 4100 万行的表。最近我添加了一个新的浮点列,并想用增量数据填充它。每个下一个值都应该是前一个值增加RAND()
. 第一个值也是RAND()
。
这个怎么做?
查询
SELECT ID FROM MY_TABLE WHERE MY_COLUMN IS NULL ROWS 1;
最多需要 15 秒,所以我不会指望这个查询在循环中执行。
该表有一个索引 ID 列,它是复合主键的一部分。
就像是
update MyTable set MyColumn = Gen_ID( TempGen,
round( rand() * 100000) ) / 100000.0
或者使用存储过程或执行块
就像是
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