PostgreSQL + PDO で lastInsertId

PDOでPostgreSQLを叩くとき、lastInsertIdを取得するにはシーケンスオブジェクト名を投げる必要があるそうな。

CREATE TABLE test (
  id SERIAL PRIMARY KEY,
  name VARCHAR(255)
);

てな感じでテーブル定義して、ここにINSERTした後でlastInsertIdを取得するには、

$lastId = $this->dbh->lastInsertId('test_id_seq');

とかやって、シーケンス名を引数として与えないと取れません。MySQLの場合は引数なしで取れるので、処理を振り分ける必要があります。プログラム自体はMySQLと互換性を持たせて…とか思うとちょっと厄介ですね。プライマリキーをidに固定して、INSERT時にテーブル名を覚えておく、とかそんな方法で回避するのが手っ取り早いかな?

あと、

$this->dbh->prepare('INSERT INTO test (name) VALUES ("テスト")');

MySQLだと通るけど、PostgreSQLだと通らないとか。

$this->dbh->prepare("INSERT INTO test (name) VALUES ('テスト')");

だったら両方通るから、SQLを書く時はこっちの書式に統一しておかないと。