使用Flame Robin使用增量数据填充Firebird列

时间:2017-06-29 11:42:14

标签: firebird flamerobin

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

怎么做?

查询

SELECT ID FROM MY_TABLE WHERE MY_COLUMN IS NULL ROWS 1;

最多需要15秒,因此我不会指望在循环中执行此查询。

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

1 个答案:

答案 0 :(得分: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. 放下发电机
  5. 或者使用存储过程或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