8

Postgresqlを使用していますが、PDOを使用して最新の挿入IDを取得したいのですが、問題が発生しました。これが私のコードです:

$db->lastInsertId('columnName');

エラーメッセージには

SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "columnName" does not exist

PHPマニュアルに記載されている「シーケンスオブジェクト」について誤解していると思います。

Note:

Returns the ID of the last inserted row, or the last value from a sequence object, 
depending on the underlying driver. For example, PDO_PGSQL() requires you to specify the 
name of a sequence object for the name parameter.

現在、「columnName」はその自動インクリメントされた属性の文字列です。誰かが私がどこで間違っていたかを指摘できますか?ありがとう。

4

4 に答える 4

17

PostgreSQLはシーケンスserialを使用して列の値を生成しますserial。通常、列はPostgreSQLの「自動インクリメント」列に使用されます。シーケンスには名前があり、通常、特定のテーブルから独立しているため、1つのシーケンスで複数の異なるテーブルの一意のIDを生成できます。シーケンス名はlastInsertId、引数として必要なものです。

たとえば、PDO_PGSQL()では、 nameパラメーターにシーケンスオブジェクトの名前を指定する必要があります。

PostgreSQLによって作成されたシーケンスオブジェクトは自動的に名前が付けられます[table]_[column]_seq

$id = $db->lastInsertId('tableName_columnName_seq');
于 2012-05-08T04:40:17.410 に答える
3

私は今日この問題に遭遇しました、lastInsertId()はfalseを返すだけでした。別のスレッドで私の問題を解決した答えを見つけました:https ://stackoverflow.com/a/31638196/1477123

CREATE TABLE ingredients (
    id         SERIAL PRIMARY KEY,
    name       varchar(255) NOT NULL,
);

したがって、シーケンス名はcomponents_id_seqになります

$db->lastInsertId('ingredients_id_seq');
于 2016-02-16T19:14:40.540 に答える
1

したがって、シーケンス名ingredients_id_seq

$db->lastInsertId('ingredients_id_seq');

このフォーマットは実際に私の問題を解決しました!!!

于 2016-04-22T16:56:12.433 に答える
-1

列名の代わりにシーケンス名を使用する

$db->lastInsertId('columnName');
于 2015-10-02T09:34:37.680 に答える