私はFirebirdの新機能ですが、私はPHPでCSVファイルを読み込んで、既存のFirebirdデータベースにそのデータを埋め込む小さなスクリプトを書きたいと思います。 問題は、私は実際にオートインクリメントジェネレータの使い方を知らないということです。私はたくさんのグーグルで探検しましたが、それはまだ私にとってはミステリーです。 dbにgen_mainジェネレータが定義されていますが、IBExpertのクエリービルダーで使用できますが、PHPではできません。 ibase_gen_idという名前の関数がありますが、その "PDO-way"は何ですか? PDOでオートインクリメントされたフィールドを持つ行を挿入するプロセスは何ですか? ありがとうございます!PHP PDO Firebirdの挿入
答えて
注:私は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のように)1行しか含まないことが保証されています。 次のシーケンス値を取得するには、SELECT NEXT VALUE FOR GEN_MAIN FROM RDB$DATABASE
またはSELECT GEN_ID(GEN_MAIN, 1) FROM RDB$DATABASE
が必要です。
一般的には、自動インクリメントを実行するためのトリガーを追加することをお勧めします。詳しくは、Firebird Generator Guideをご覧ください。次に、INSERT ... RETURNING <column-list>
を使用して、生成されたIDを取得できます。
ありがとう、それは有用でしたが、次の値を選択できません(クエリ: "NEXT VALUE FOR GEN_MAIN"): "動的SQLエラーSQLエラーコード= -104トークン不明 - 1行目、1列目NEXT " – haxpanel
これは私がRDB $ DATABASEに対して選択することに注意した理由です:FirebirdではSELECTを使用して値を取得する必要があり、常にテーブルに対して選択する必要があります。 (OracleのDUALのように)1行だけですので、次のジェネレータ値を取得するには、 'GEN_MAIN FROM RDB $ DATABASE'または' SELECT GEN_ID(GEN_MAIN、1)FRDB RDB $ DATABASE'が必要です。 –
トリック次の値を取得するが、これは解決策ではない考えてみてください: "Product"から最初に1つのgen_id(GEN_MAIN、1)を選択してください – haxpanel
トリガーを使用してデータベースを自動インクリメントしていますか?その後、自分で使う必要はありません。 –
IBExpertでテーブルの依存関係を見ても、トリガーの依存関係はありません。どういうわけかそれを確認して確実に確認できますか?たとえば、新しいレコードを追加してIDフィールドを空白のままにしますか? – haxpanel
IDフィールドのない挿入を発行して、何が起こるかを見てください。 –