MW211 EXIT

devlog
PostgreSQL/insertしたレコードのIDを取得
2011年09月14日
insertしたデータのシーケンシャルIDを取得する方法は以下の通り。
#selectと取得するとその間に割り込みの危険性があるからこの方法で
┌──────────────────────────────────────┐
│$pg_db = pg_connect('host=ホスト名 port=ポート名 dbname=DB名                │
│ user=ユーザ名 password=パスワード);                                        │
├──────────────────────────────────────┤
│$sql = "INSERT INTO 表 (列) VALUES ('値') RETURNING id";                    │
│$pg_result = pg_query($pg_db, $sql);                                        │
│$row = pg_fetch_array($pg_result);                                          │
└──────────────────────────────────────┘
ここで「$row['id']」を参照する。

INSERT文のSQL発行と同時にSELECT文のSQLを発行して取得したようなイメージ。
「RETURNING」句を使うのがミソ。
SELECT句と同じような指定になる。

一方、PDOの場合は以下のような感じになる。
┌──────────────────────────────────────┐
│$dbh = new PDO(DSN名, ユーザ名, パスワード);                                │
├──────────────────────────────────────┤
│$sql = "INSERT INTO 表 (列) VALUES ('値')";                                 │
│$sth = $dbh->prepare($sql);                                                 │
│$sth->execute();                                                            │
└──────────────────────────────────────┘
ここで「$dbh->lastInsertId('シーケンスオブジェクト名')」を参照する。

シーケンスオブジェクト名とは、「表名_id_seq」みたいなやつ。
AutoNumber的な項目をCREATE文実行すると自動で作成されるみたい。
MySQLの場合はこれが不要(「()」でいい)らしい。
分類:PostgreSQL