我的理解是,每個值只會被一個序列發出一次。如果您使用 nextval() 從序列中取出一個數字(例如 12),該序列將會前進,後續呼叫 nextval() 將會返回序列中後續的數字(12 之後)。
這表示如果您使用 nextval() 取得一個值來作為主鍵,您可以保證在該序列上沒有其他呼叫 nextval() 會返回相同的值。沒有競爭條件,不需要事務處理。
據我所知,這就是序列的*用途* :^)
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_last_oid — 傳回最後一列的 OID
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()。
版本 | 說明 |
---|---|
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);
?>
我的理解是,每個值只會被一個序列發出一次。如果您使用 nextval() 從序列中取出一個數字(例如 12),該序列將會前進,後續呼叫 nextval() 將會返回序列中後續的數字(12 之後)。
這表示如果您使用 nextval() 取得一個值來作為主鍵,您可以保證在該序列上沒有其他呼叫 nextval() 會返回相同的值。沒有競爭條件,不需要事務處理。
據我所知,這就是序列的*用途* :^)
正如在繁忙的網站上所指出的,上述某些方法實際上可能會給您錯誤的答案,因為在您插入記錄和選擇記錄之間插入了另一條記錄。為了避免這種情況,請將其放入事務中,並且在完成所有工作之前不要提交。
這是一個非常有用的函式 :)
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];
}
在插入後呼叫即可 ;)
您可以使用以下方法來取得最後插入的 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。
我分享一個我在網路上找到的優雅解決方案 (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
只需取得 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 -> 找到了!
)