【问题标题】:Using a generator to insert a new row into a Firebird Database使用生成器将新行插入 Firebird 数据库
【发布时间】:2021-04-26 19:49:07
【问题描述】:

有一种方法可以使用生成器将新行插入 Firebird 数据库,但出于本项目的目的,我不应该使用触发器来获取要插入的表的下一个 ID。

我在 .NET MVC 项目中使用 Firebird 实体框架。我能做些什么来保证插入的新行没有重复的主键或其他冲突?

重要的是要提到我想通过控制器或方法来控制这种情况。

【问题讨论】:

  • 为什么不应该使用触发器,这是什么任意限制?你是限制在 Firebird 2.5 上的吗?如果你可以使用 Firebird 3,你可以使用 identity column (generated by default as identity)

标签: asp.net firebird firebird2.5


【解决方案1】:

如果您定义了主键,则不可能有重复的主键(但尝试插入具有已存在 id 的行会产生错误)。

如果您确实不允许使用触发器(老实说,这听起来像是一个相当随意且适得其反的要求),您可以创建一个序列(又名生成器),并使用 @987654321 在您的插入语句中生成 id @表达式。

所以,创建一个序列(每个表一个):

create sequence sq_mytable;

并在插入时使用它:

insert into mytable (id, column1, column2) 
  values (next value for sq_mytable, 'value1', 'value2');

【讨论】:

  • 你说得对,这是一个武断且适得其反的要求。但这就是我们得到的。我会尝试你的解决方案,但首先我需要调整它以与 Linq 一起使用。
  • @Klezk 老实说,我不确定你是否可以让它与 Linq 一起使用。使用触发器会更容易解决这个问题(或升级到 Firebird 3 并使用标识列)。
  • @Klezk 如果 Linq 允许从插入返回数据,您还可以使用 INSERT ... VALUES ... RETURNING id 子句将新 ID 值接收到查询对象中吗?
  • @MarkRotteveel 不幸的是,我们无法升级到 Firebird 3,因为它是我们正在开发的现有数据库的集成。直接使用 Linq 是不可能的,但我使用的是 Firebird Entity Framework 的原始查询。我还在努力。
  • @Arioch'The 不,仅当您在插入新的实例类表后使用 EF 时。
猜你喜欢
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 2018-03-09
相关资源
最近更新 更多