2012-01-17 110 views
1

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

+0

数据库是否使用触发器来自动增量?那么你不需要自己使用它 – 2012-01-17 14:03:43

+0

正如我在IBExpert中看到该表的依赖关系那样,没有触发依赖性。我可以检查它以确定吗?例如,通过添加新记录,但保留空白ID字段? – haxpanel 2012-01-17 14:18:24

+0

只需发出没有ID字段的插入,看看会发生什么。 – 2012-01-17 14:33:28

回答

3

注:我从来没有使用过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$DATABASESELECT GEN_ID(GEN_MAIN, 1) FROM RDB$DATABASE来获得下一个序列值。

一般来说,但我建议你添加一个触发器来为你做自动增量,详情请看Firebird Generator Guide。然后您可以使用INSERT ... RETURNING <column-list>来检索生成的ID。

+0

谢谢,它很有用,但我无法选择下一个值(查询:“GEN_MAIN的下一个值”):“动态SQL错误SQL错误代码= -104令牌未知 - 第1行,第1列下一个“ – haxpanel 2012-01-17 15:59:35

+0

这就是为什么我注意到选择反对RDB $ DATABASE:在Firebird中,您需要使用SELECT来检索值,并且您始终需要根据表选择RDB $ DATABASE保证包含只有一行(如Oracle的DUAL),所以你需要'从RDB $ DATABASE'选择下一个值为GEN_MAIN或者从RDB $ DATABASE'选择GEN_ID(GEN_MAIN,1)来获得下一个生成器的值 – 2012-01-17 16:02:36

+0

我可以使用一个技巧检索下一个值,但这不是我的解决方案请考虑:从“产品”中选择第一个gen_id(GEN_MAIN,1) – haxpanel 2012-01-17 16:04:57