postgresql - Curval не работает, используя PHP PDO - PullRequest
2 голосов
/ 22 июля 2011

Итак, я пытаюсь запустить здесь какой-то SQL через PDO PHP (что, как я считаю, не должно быть проблемой), например:

INSERT INTO example (
    d_id,
    s_id
) 
    VALUES (
    currval('d_id_seq'),
    currval('s_id_seq')
);

У меня есть две последовательности, называемые d_id_seq и s_id_sec (давайте представим, что у меня есть таблица с именем d и таблица с именем s, и эта последовательность представляет собой столбец с именем ID и типом serial).

Теперь, очевидно, я делаю этонеправильно, так как я получаю сообщение об ошибке, что последовательность не используется в этом сеансе:

Объект не находится в необходимом состоянии: 7 ОШИБКА: в этом сеансе еще не определен курс для последовательности "d_id_seq"

Итак, как мне написать это?

Ответы [ 3 ]

2 голосов
/ 31 октября 2013

Проблема может быть решена с помощью следующей команды:

SELECT last_value FROM d_id_seq;

Обратите внимание, что я использую PostgreSQL 9.1.9, я не знаю о других или более старых версиях.

1 голос
/ 22 июля 2011

Из тонкой инструкции :

currval
Вернуть значение, полученное последним значением nextval для этой последовательности в текущем сеансе. (Сообщается об ошибке, если nextval никогда не вызывался для этой последовательности в этом сеансе.) Поскольку он возвращает локальное значение сеанса, он дает предсказуемый ответ, выполнили ли другие сеансы nextval со времени текущего сеанса.

Вы используете currval, чтобы получить последнее значение, которое было извлечено из последовательности в текущем сеансе . Обычный шаблон - сделать INSERT, который использует последовательность, и затем вы вызываете currval, чтобы выяснить, какое значение используется INSERT. Если вы не вызвали nextval с рассматриваемой последовательностью в текущем сеансе, то currval ничего не может вернуть.

Может быть, вы на самом деле ищете select max(id) from d и select max(id) from s:

INSERT INTO example (d_id, s_id)
SELECT MAX(d.id), MAX(s.id)
FROM d, s;

Или, может быть, вам нужно обернуть вставки d и s в хранимую процедуру, которая заботится о вставке сразу во все три таблицы.

1 голос
/ 22 июля 2011

Ошибка означает, что вы не «использовали» последовательность в этом сеансе (соединение postgres).Например, вы не делали никаких INSERT для таблицы d.

Возможно, у вас есть ошибка в вашем коде и вы переподключаетесь к postgres после каждого запроса?

Более удобный способ сделать это -используйте INSERT RETURNING на ваших INSERT.Тогда вы получите идентификаторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...