2012-01-17 153 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