1

我有一个巨大的 Firebird 数据库,其中包含一个包含 4100 万行的表。最近我添加了一个新的浮点列,并想用增量数据填充它。每个下一个值都应该是前一个值增加RAND(). 第一个值也是RAND()

这个怎么做?

查询

SELECT ID FROM MY_TABLE WHERE MY_COLUMN IS NULL ROWS 1;

最多需要 15 秒,所以我不会指望这个查询在循环中执行。

该表有一个索引 ID 列,它是复合主键的一部分。

4

1 回答 1

0

就像是

 update MyTable set MyColumn = Gen_ID( TempGen, 
     round( rand() * 100000) ) / 100000.0
  1. 创建一个临时生成器 - https://www.firebirdsql.org/manual/generatorguide.html
  2. 使用整数生成器作为按某个系数缩放的浮点值,例如 100 000 代表 1.0 和 10 000 代表 0.1 等
  3. 使用 GEN_ID 函数为指定数量的整数单元转发生成器
  4. 放下发电机

或者使用存储过程或执行块

就像是

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
于 2017-06-29T12:24:44.607 回答