Archive for the ‘PostgreSQL’ Category

CakePHP で最後に追加したレコードのIDをとってくる。

getInsertID()とgetLastInsertID() という関数。
2つあるらしく。
CakePHP:getLastInsertIDって、どうよ(PHP)–WEBシステム開発 技術的備忘録(通称 技忘録)

何してるのかわからんかったので調べた。
from cake/libs/model/model.php :

        function getLastInsertID() {
                return $this->getInsertID();
        }

ヽ(`Д´)ノもう来ねぇよウワァァァァン

というわけで気をとりなおして、getInsertID()。

        function getInsertID() {
                return $this->__insertID;
        }

modelクラス変数 $__insertID を見に行ってるのね。
そんなわけで、$__insertID を探したら・・・

        function setInsertID($id) {
                $this->__insertID = $id;
        }

・・・。
ヽ(`Д´)ノもう来ねぇよウワァァァァン

またまた気を取り直して。

ちなみに、setInsertID は、データソースのほうで使用してます。
cake/libs/model/datasources/dbo_source.php

function create(&$model, $fields = null, $values = null) {
// 中略
    if ($this->execute($this->renderStatement('create', $query))) {
        if (empty($id)) {
            $id = $this->lastInsertId($this->fullTableName($model, false),
                    $model->primaryKey);
            }
            $model->setInsertID($id);
// 以下略

そして、lastInsertID は各DBによって違う挙動となります。
一番最後に挿入したレコードのidを取得する方法はRDBMSによってまちまちですからね。

MySQLの場合:datasources/dbo/dbo_mysql.php

        function lastInsertId($source = null) {
                $id = $this->fetchRow('SELECT LAST_INSERT_ID() AS insertID', false);
// 以下略

つまり、LAST_INSERT_ID() の値。

PostgreSQLの場合:datasources/dbo/dbo_postgres.php

        function lastInsertId($source, $field = 'id') {
                $seq = $this->getSequence($source, $field);
                $data = $this->fetchRow("SELECT currval('{$seq}') as max");
                return $data[0]['max'];

$seq というのはシーケンスの名前。
詳しくはPostgreSQLのシーケンス操作関数あたり参照。