【问题标题】:Fill Firebird column with incremental data using Flame Robin使用 Flame Robin 用增量数据填充 Firebird 列
【发布时间】:2017-12-03 02:21:51
【问题描述】:

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

如何做到这一点?

查询

SELECT ID FROM MY_TABLE WHERE MY_COLUMN IS NULL ROWS 1;

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

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

【问题讨论】:

  • Firebird 的哪个版本?

标签: firebird flamerobin


【解决方案1】:

类似

 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

【讨论】:

    猜你喜欢
    • 2013-09-23
    • 2012-07-04
    • 2022-06-30
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多