Есть ли эквивалент $ mysqli-> insert_id в postgresql 9.3? Я импортирую в одну таблицу, но мне нужно взять последний первичный ключ, созданный в таблице, и применить его как внешний ключ во второй таблице? Таблица 1 —-> Таблица 2 для завершения записи.
Немного больше информации:
$sql = "INSERT INTO sheet_tbl (site_id, eventdate) VALUES ('$_POST[site_id]','$_POST[eventdate]') returning id";
** Используя sql выше, я вставляю свою запись, как бы использовать ее в моей следующей вставке SQL. Если я использую возвращаемый идентификатор, где хранится этот идентификатор, как его использовать в другом заявлении INSERT?
$sql1 = "INSERT INTO record_tbl (line, taxom_id, number_of_taxom, sheet_id) VALUES (1,1,'$_POST[cased_numbers]','$_POST[sheet_id]')"; $result = pg_query($sql1);
Если вам нужен PK строки, которую вы только что вставили (или любое выражение, используя столбцы таблицы), вы можете использовать предложение RETURNING. Документы: условие возврата
Например.
test=# create table a (id serial, val text); NOTICE: CREATE TABLE will create implicit sequence "a_id_seq" for serial column "a.id" CREATE TABLE test=# insert into a (val) values ('foo') returning id; id ---- 1
В PostgreSQL значения первичного ключа обычно исходят из последовательности как наилучшей практики. Вы можете использовать SELECT currval('sequence_name');
чтобы получить последнее значение определенной последовательности или SELECT lastval()
чтобы получить последнее значение любой последовательности. Подробнее см. В официальных документах .
Вы можете увидеть пример работы currval
в этом currval
SQL . Имейте в виду, что требуется использовать последовательность уже в сеансе, как это делает вставка. Вызов currval
когда последовательность не использовалась в текущем сеансе, является ошибкой.
Если вы используете PDO в PHP, метод lastInsertId поддерживается PostgreSQL, но вам требуется указать идентификатор последовательности. Доступны дополнительные документы и обсуждение PDO :: lastInsertId .
Как предлагает @bma, использование предложения RETURNING
в INSERT
является хорошим способом вернуть значение первичного ключа только что вставленной строки:
insert into a (val) values ('foo') returning id;
Кроме того, ваш синтаксис показывает, что он может быть уязвим для атаки SQL-инъекции, потому что вы передаете неутвержденный ввод непосредственно в базу данных, не ускользая от него. Рассмотрите возможность использования pg_query_params
или другой альтернативы, чтобы убедиться, что ваши входы правильно экранированы.
Фактически вы можете сделать это в одном запросе:
WITH sheet AS( INSERT INTO sheet_tbl (site_id, eventdate) VALUES ('$_POST[site_id]','$_POST[eventdate]') returning id ) INSERT INTO record_tbl select 1,1,'$_POST[cased_numbers]',id FROM sheet;