插入没有主键列值的行失败

时间:2019-02-18 08:00:01

标签: stored-procedures firebird sql-insert firebird2.5

对于下表: enter image description here

我运行以下存储过程:

enter image description here

我被重定向到“结果”标签,什么也没看到。然后,如果我单击“刷新”图标(在“结果”选项卡下面),则出现对话框:

SQLCODE = -625列ID的验证错误,值“ *空*

enter image description here

当然,什么也没添加...

据我了解,firebird期望RC_ID的某个值(这是我的PK,应主要自动递增)。如果我也为RC_ID赋值,则效果很好。

那么,我该怎么做才能清楚地“插入”这些错误?

2 个答案:

答案 0 :(得分:1)

问题是您没有为主键设置值。与您的期望相反,主键不会自动增加。我知道的任何数据库都是这种情况。尽管某些工具(表构建器)可能已默认将其标记为身份,自动递增或已生成,或通过其他方式获得该行为,但您始终需要将其标记为身份。

如果您使用的是Firebird 3,则可以将列定义为GENERATED BY DEFAULT AS IDENTITY(请参阅Firebird 3发行说明中的​​Identity Column Type)。对于早期的Firebird版本,最好的方法是使用一个填充主键列的插入前触发器定义一个序列(也称为生成器)。

有关如何定义标识列(或定义触发器)的更多详细信息,请参见我对以下问题的回答:Easiest way to create an auto increment field in Firebird database

答案 1 :(得分:0)

在firebird中,自动增量无法像在MySQL中那样工作。因此,必须发送RC_ID的值...

我发现了一些基于想法的工作示例:

  • 创建一个生成器
  • 将其分配给列(PK)
  • 像这样用该生成器调用GEN_ID:

   begin
      insert into RESERVATIONCATEGORY (RC_ID, RC_NAAM)
      values (
      GEN_ID(GEN_RESERVATIONCATEGORY _ID,1), 'selam'
      );
      suspend;
    end