【问题标题】:PHP PDO Firebird insertingPHP PDO火鸟插入
【发布时间】:2012-02-12 07:56:26
【问题描述】:

我是 Firebird 的新手,但我想用 PHP 编写一个小脚本来读取 CSV 文件并用其数据填充现有的 Firebird 数据库。 问题是我真的不知道如何使用自动增量生成器。我用谷歌搜索了很多,但对我来说仍然是个谜。 db 中定义了一个 gen_main 生成器,我可以在 IBExpert 的查询构建器中使用它,但不能在 PHP 中使用它... 我看到了一个名为 ibase_gen_id 的函数,它的“PDO 方式”是什么? 使用 PDO 插入具有自动递增字段的行的过程是什么? 提前致谢!

【问题讨论】:

  • 数据库是否使用触发器自动递增?那你就不用自己用了
  • 我在IBExpert中看到了表的依赖关系,没有触发器依赖。我可以以某种方式检查它以确定吗?例如,通过添加新记录但将 ID 字段留空?
  • 只需发出一个不带 ID 字段的插入,看看会发生什么。
  • 它说:“插入失败,因为列定义包含验证约束。列 ID 的验证错误,值 *** null ***”
  • 好的,那就没有触发器了。

标签: php insert pdo firebird auto-increment


【解决方案1】:

注意:我从未使用过 PDO,因此无法评论 PDO 的具体细节。

根据您的具体需求,您可以使用:NEXT VALUE FOR

NEXT VALUE FOR <sequence-name>

GEN_ID

GEN_ID(<sequence-name>, 1)

获取序列/生成器的下一个值。

您可以直接在 INSERT 语句中使用它们,或者在插入之前先对 RDB$DATABASE 发出 SELECT 查询以自己检索值:在 Firebird 中,您需要使用 SELECT 来检索值,并且您始终需要选择对着一张桌子。 RDB$DATABASE 保证只包含一行(如 Oracle 的 DUAL)。 所以你需要SELECT NEXT VALUE FOR GEN_MAIN FROM RDB$DATABASE或者SELECT GEN_ID(GEN_MAIN, 1) FROM RDB$DATABASE来获取下一个序列值。

不过,一般来说,我建议您添加一个触发器来为您执行自动增量,请参阅Firebird Generator Guide 了解详细信息。然后您可以使用INSERT ... RETURNING &lt;column-list&gt; 来检索生成的 id。

【讨论】:

  • 谢谢,它很有用,但我无法选择下一个值(查询:“NEXT VALUE FOR GEN_MAIN”):“动态 SQL 错误 SQL 错误代码 = -104 令牌未知 - 第 1 行,第 1 列 NEXT"
  • 这就是为什么我指出要对 RDB$DATABASE 进行选择:在 Firebird 中,您需要使用 SELECT 来检索值,并且您总是需要对表进行选择。 RDB$DATABASE 保证只包含一行(如 Oracle 的 DUAL)。所以你需要SELECT NEXT VALUE FOR GEN_MAIN FROM RDB$DATABASESELECT GEN_ID(GEN_MAIN, 1) FROM RDB$DATABASE 来获取下一个生成器值。
  • 我可以使用一个技巧来检索下一个值,但这不是我认为的解决方案:从“产品”中选择前 1 个 gen_id(GEN_MAIN,1)
  • 使用 RDB$DATABASE,而不是随机表。
  • 好的,谢谢!它有效,但我认为这不是获取下一个 ID 的正确方法。但我强调,它有效!这不是我的数据库,除了填充数据之外,我无法添加触发器或任何修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
相关资源
最近更新 更多