문제

대안 있는 대 mysql_insert_id() php 능 PostgreSQL?대부분의 프레임워크가 문제를 해결에 의해 부분적으로 찾는의 현재 값 순서에서 사용되는 ID 입니다.그런데,시간이있는 기본 키가 없는 직렬 열....

도움이 되었습니까?

해결책

에서 PostgreSQL 의 관점에서,의사 코드:

 * $insert_id = INSERT...RETURNING foo_id;-- only works for PostgreSQL >= 8.2. 

 * INSERT...; $insert_id = SELECT lastval(); -- works for PostgreSQL >= 8.1

 * $insert_id = SELECT nextval('foo_seq'); INSERT INTO table (foo...) values ($insert_id...) for older PostgreSQL (and newer PostgreSQL)

pg_last_oid() 만을 Oid.Oid 는 기본적으로 이후 PostgreSQL8.1.

그래서에 따라 PostgreSQL 버전,당신은 선택해야 하는 위의 방법입니다.이상적으로는 물론,데이터베이스를 사용하여 추상화하는 라이브러리는 초록다습니다.그렇지 않으면서 낮은 수준의 코드,그것은 다음과 같:

방법 중 하나:INSERT...로 돌아

// yes, we're not using pg_insert()
$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_row($result);
$insert_id = $insert_row[0];

방법은 두:삽입;lastval()

$result = pg_execute($db, "INSERT INTO foo (bar) values (123);");
$insert_query = pg_query("SELECT lastval();");
$insert_row = pg_fetch_row($insert_query);
$insert_id = $insert_row[0];

방법은 세 가지:nextval();삽입

$insert_query = pg_query($db, "SELECT nextval('foo_seq');");
$insert_row = pg_fetch_row($insert_query);
$insert_id = $insert_row[0];
$result = pg_execute($db, "INSERT INTO foo (foo_id, bar) VALUES ($insert_id, 123);");

기 될 것이 세 번째 방법은,하지만 그것이 어렵습니다.가장 깨끗한 것은 첫째,하지만 당신은 실행해야 최근 PostgreSQL.대부분의 db 추출 라이브러리가 없어 아직 사용할 첫 번째 방법은 하지만입니다.

다른 팁

체크아웃 반 선택적 절 INSERT statement.(에 대한 링크를 공식 PostgreSQL 문서 참고)

그러나 기본적으로,당신은:

INSERT INTO table (col1, col2) VALUES (1, 2) RETURNING pkey_col

고 INSERT 문은 그 자체 반환합니다 id(거나 어떤 표현을 지정합)의 영향을 받는다.

서 php.net:

$res=pg_query("SELECT nextval('foo_key_seq') as key");
$row=pg_fetch_array($res, 0);
$key=$row['key'];
// now we have the serial value in $key, let's do the insert
pg_query("INSERT INTO foo (key, foo) VALUES ($key, 'blah blah')");

이것은 항상을 제공하는 독특한 키,기 때문에 핵심에서 검색된 데이터베이스를 검색되지 않은 다시.

사용할 수도 있습니다:

$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_result($result, 0, 'foo_id');

에서 지정해야 pg_fetch_result 수 행하고 있는 필드의 이름을 찾고,이것은 더 많은 정확한 방법으로 데이터를 얻을 수있는,당신이 필요로 하지만 내가 알지 못하는 경우 이것은 어떤 처벌의 성능에서 쿼리를 실행합니다.을 기억하는 이 방법은 PostgreSQL 버전 8.2 니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top