Вопрос по postgresql, php – lastInsertId не работает в Postgresql

8

Я использую Postgresql, когда я хочу использовать PDO для получения последнего идентификатора вставки, у меня возникла проблема. Вот мой код:

$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.

В настоящее время & quot; columnName & quot; это строка этого автоинкрементного атрибута. Кто-нибудь может указать, где я ошибся? Благодарю.

Возможный дубликатGet last insert id after a prepared insert with PDO Alastair Irvine

Ваш Ответ

4   ответа
16

последовательности генерировать значения дляserial колонны иserial столбцы, как правило, используются для "автоинкрементации"; столбцы в PostgreSQL. Последовательности имеют имена и, как правило, не зависят от какой-либо конкретной таблицы, поэтому вы можете иметь одну последовательность, генерирующую уникальные идентификаторы для нескольких разных таблиц; имя последовательности есть чтоlastInsertId хочет в качестве аргумента:

For example, PDO_PGSQL() requires you to specify the name of a sequence object for the name parameter.

Объект последовательности, созданный PostgreSQL, автоматически получает имя[table]_[column]_seq, Так:

$id = $db->lastInsertId('tableName_columnName_seq');
table_column_seq, это оно! Спасибо вам! Michael
@ Майкл: Вы также можете посмотреть наINSERT ... RETURNING id и обойтиlastInsertId полностью.
@ Майкл: Тогда вам нужно знать название последовательности. По умолчанию будетt_c_seq гдеt это имя таблицы иc это имя столбца. Это требование довольно странно, хотя. У меня нет всех настроенных банкоматов PHP / PostgreSQL, поэтому я не могу проверить что-либо из этого самостоятельно.
не работает таким образом. PGSQL "требует" параметр для указания объекта последовательности. Если вы оставите это поле пустым, ничего не возвращается. Michael
3

lastInsertId () возвращал только ложь. Нашел ответ, который решил мою проблему в другой теме:https://stackoverflow.com/a/31638196/1477123

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

Таким образом, имя последовательности будет ингридиентом_id_seq

$db->lastInsertId('ingredients_id_seq');
1

Итакsequence name будетingredients_id_seq,

$db->lastInsertId('ingredients_id_seq');

Этот формат фактически решил мои проблемы !!!

вы также можете использовать $ db-> gt; nextval ();
-1

$db->lastInsertId('columnName');

Похожие вопросы