“插入选择”,使用生成器作为 ID 字段

问题描述 投票:0回答:1

我正在尝试使用基于表 B 的主 ID 的生成器从具有 5 条记录的查询 A 插入表 B,我们将其称为 GEN_B,这样它们就不会重复表 B 中的 ID。

TableB 有(ID,nameB,lastnameB)。 QueryA(5条记录)是这里的选择查询:

Insert Into TableB (ID, nameB, lastnameB) 
SELECT 
  GEN_ID(GEN_B,1), Name, LastNAme
FROM 
  Table123
  left join .....
  left join.....
where...

为什么当我运行“Insert into Select...”时,我只看到 1 条记录被插入到 TAbleB 中,而不是 select QueryA 中的 5 条记录?是发电机的原因吗?不是每次都更新插入的记录吗?我需要为此创建一个执行块吗?如果有的话有什么想法吗?谢谢

sql delphi firebird
1个回答
0
投票

不要在插入语句中显式指定要使用的生成器值,而是使用触发器在添加任何新行时自动使用生成器中的下一个值,而不指定 ID 列的值。

来自 Firebird 关于生成器的文档的修改示例

CREATE TRIGGER trgB_BI for B
active before insert position 0
as
begin
  if ((new.ID is null) or (new.ID = 0)) then
  begin
    new.ID = gen_id(GEN_B, 1);
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.