PHP Conference Japan 2024

pg_last_oid

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_last_oid傳回最後一列的 OID

說明

pg_last_oid(PgSql\Result $result): 字串|整數|false

pg_last_oid() 用於擷取賦予插入列的 OID

從 PostgreSQL 7.2 開始,OID 欄位變成一個可選欄位,在 PostgreSQL 8.1 中預設不會出現。當表格中沒有 OID 欄位時,程式設計師必須使用 pg_result_status() 來檢查插入是否成功。

要取得插入列中 SERIAL 欄位的值,必須使用 PostgreSQL 的 CURRVAL 函式,並指定需要其最後一個值的序列名稱。如果序列名稱未知,則需要使用 PostgreSQL 8.0 的 pg_get_serial_sequence 函式。

PostgreSQL 8.1 有一個 LASTVAL 函式,它會傳回工作階段中最近使用的序列值。這避免了需要指定序列、表格或欄位名稱。

注意事項:

這個函式以前稱為 pg_getlastoid()

參數

result

pg_query()pg_query_params()pg_execute()(以及其他函式)傳回的 PgSql\Result 實例。

回傳值

一個 整數字串,包含指定 連線 中最近插入列的 OID,如果發生錯誤或沒有可用的 OID,則傳回 false

更新日誌

版本 說明
8.1.0 result 參數現在需要一個 PgSql\Result 實例;以前需要的是一個資源

範例

範例 #1 pg_last_oid() 範例

<?php
// 連線到資料庫
pg_connect("dbname=mark host=localhost");

// 建立一個範例表格
pg_query("CREATE TABLE test (a INTEGER) WITH OIDS");

// 插入一些資料
$res = pg_query("INSERT INTO test VALUES (1)");

$oid = pg_last_oid($res);
?>

參見

新增註記

使用者貢獻的註記 6 則註記

julian at e2-media dot co dot nz
21 年前
我的理解是,每個值只會被一個序列發出一次。如果您使用 nextval() 從序列中取出一個數字(例如 12),該序列將會前進,後續呼叫 nextval() 將會返回序列中後續的數字(12 之後)。

這表示如果您使用 nextval() 取得一個值來作為主鍵,您可以保證在該序列上沒有其他呼叫 nextval() 會返回相同的值。沒有競爭條件,不需要事務處理。

據我所知,這就是序列的*用途* :^)
a dot bardsley at lancs dot ac dot uk
21 年前
正如在繁忙的網站上所指出的,上述某些方法實際上可能會給您錯誤的答案,因為在您插入記錄和選擇記錄之間插入了另一條記錄。為了避免這種情況,請將其放入事務中,並且在完成所有工作之前不要提交。
dtutar at yore dot com dot tr
21 年前
這是一個非常有用的函式 :)

function sql_last_inserted_id($connection, $result, $table_name, $column_name) {
$oid = pg_last_oid ( $result);
$query_for_id = "SELECT $column_name FROM $table_name WHERE oid=$oid";
$result_for_id = pg_query($connection,$query_for_id);
if(pg_num_rows($result_for_id))
$id=pg_fetch_array($result_for_id,0,PGSQL_ASSOC);
return $id[$column_name];
}

在插入後呼叫即可 ;)
webmaster at gamecrash dot net
21 年前
您可以使用以下方法來取得最後插入的 ID...

CREATE TABLE test (
id serial,
something int not null
);

這會建立序列 test_id_seq。現在,在將資料插入表格 test 後執行以下操作

INSERT INTO test (something) VALUES (123);
SELECT currval('test_id_seq') AS lastinsertid;

lastinsertid 應該包含您最後插入的 ID。
Jonathan Bond-Caron
19 年前
我分享一個我在網路上找到的優雅解決方案 (Vadim Passynkov)

CREATE RULE get_pkey_on_insert AS ON INSERT TO Customers DO SELECT currval('customers_customers_id_seq') AS id;

每次您插入資料到 Customers 表格時,PostgreSQL 都會返回一個包含您剛插入的 ID 的表格。無需擔心並行問題,因為在規則執行時資源會被鎖定。

請注意,在多個插入的情況下
INSERT INTO C1 ( ... ) ( SELECT * FROM C2);

我們會返回最後插入的行的 ID。

更多關於 PostgreSQL 規則的資訊
https://postgresql.dev.org.tw/docs/7.4/interactive/sql-createrule.html
qeremy [atta] gmail [dotta] com
12 年前
只需取得 LAST_INSERT_ID 即可;

<?php
// 注意:正在等待下方 pg_query 的「select」部分。
// 注意:使用分號 (;) 分隔查詢部分。

$qry = pg_query("
INSERT INTO users (id,uname,upass,rep) VALUES (DEFAULT,'bubu','a981v',0.19);
SELECT Currval('users_id_seq') LIMIT 1
"
);

// 或
$qry = pg_query("
INSERT INTO users (id,uname,upass,rep) VALUES (DEFAULT,'bubu','a981v',0.19) RETURNING Currval('users_id_seq')"
);

$fch = pg_fetch_row($qry);
print_r($fch);
?>

陣列
(
[0] => 3 -> 找到了!
)
To Top