シーケンス
シーケンス – シーケンスおよび自動採番
Description
シーケンスとは、データの行に一意な ID を与えるための手法です。
もしあなたが MySQL を常用しているのなら、シーケンスとは
AUTO_INCREMENT
を実現するための別の方法と考えればよいでしょう。
簡単な話です。まず最初に ID を要求し、新しく作成した行の ID
フィールドの値の値としてそれを使用します。すべてのテーブルに対して、
いくつでもシーケンスを保持することができます。ただ、
ひとつのテーブルに対しては常に同じシーケンスを使用するようにしましょう。
この一意な ID の値を取得するには、
nextID() を使用します。
もしシーケンスが存在しない場合は、自動的に作成されます。
シーケンスは、
nextID()
がコールされるたびに自動的に加算されます。
<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
$id = $mdb2->nextID('mySequence');
if (PEAR::isError($id)) {
die($id->getMessage());
}
// INSERT クエリで ID を使用します
$res =& $mdb2->query("INSERT INTO myTable (id, text) VALUES ($id, 'foo')");
?>
Note
PEAR MDB2 のシーケンスメソッドを使用するなら、
シーケンスの作成も含めてすべての場面でそれを使用することを推奨します。
DBMS で直接作成したシーケンスに対して
MDB2 のメソッドを使用しないでください。
このアドバイスを守れない理由があるなら、以下の点に注意してください。
PEAR MDB2 のシーケンス関連のメソッドに渡す引数 $seq_name
の値は、MDB2 がバックエンドの DBMS のメソッドをコールする前に更新されます。
$seq_name
は、PHP の
sprintf() 関数に渡されます。
sprintf() のフォーマット文字列には、
オプション seqname_format の値が用いられます。
デフォルトの seqname_format は
%s_seq です。つまり、例えば
$seq_name
として
person_id_sequence を指定したなら、
シーケンスを作成/シーケンスにアクセス/シーケンスを更新 する際に
PEAR MDB2 はその名前を person_id_sequence_seq
に変換します。
また、PEAR DB でシーケンスのエミュレートに使用しているテーブルの
デフォルトのレイアウトと PEAR MDB2 のものとは少し異なることにも注意しましょう。
PEAR DB では "id" という名前のカラムを使用していましたが、PEAR MDB2
ではその代わりに "sequence" を使用するようにし、
その目的をより明確にしています。過去との互換性のため、これは
seqcol_name オプションで制御できるようになっています。
seqname_format および seqcol_name
は、接続の際かあるいは
setOption()
で変更できます。
直近に挿入された ID の取得
AUTO_INCREMENT を使用するほうがお好みなら、
lastInsertID() メソッドを使用して
直近に作成された値を取得するという方法もあります。このメソッドは、
PostgreSQL の
SERIAL 型の書式を使用して現在のシーケンス ID
を取得することもサポートしています。
MDB2 は、自動インクリメントをサポートしていない RDBMS
に対してその振る舞いをエミュレートすることができます。
そのためには、
createTable()
メソッドを使用してテーブルを作成します。
<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
$res =& $mdb2->query("INSERT INTO myTable (id, text) VALUES (NULL, 'foo')");
// オプションでテーブル名とフィールド名を渡します。
// これは、自動インクリメントがサポートされていない環境で
// nextID() がコールされた際に使用します。
$id = $mdb2->lastInsertId('myTable', 'id');
if (PEAR::isError($id)) {
die($id->getMessage());
}
?>
現在の ID の取得
シーケンスの現在の値を取得するには、
currID() メソッドを使用します。
<?php
// シーケンスの現在の値を取得します
$id = $mdb2->currID('myseq');
if (PEAR::isError($id)) {
die($id->getMessage());
}
?>
エミュレーションについて
もし RDBMS がネイティブにサポートしている機能を使用したいのなら、
Extended モジュールの
getBeforeID() および
getAfterID() メソッドを使用します。
この方法では、AUTO_INCREMENT
がネイティブにサポートされている場合に MDB2 が自動的にそれを使用します。
サポートされていない場合は、MDB2
は代わりにシーケンスを使用して次の ID を取得します。
getBeforeID()/getAfterID() の使用法
<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
// $id は、クォートされた整数値あるいは php の null です
$id = $mdb2->getBeforeID('myTable', 'id', true, true);
if (PEAR::isError($id)) {
die($id->getMessage());
}
$res =& $mdb2->query("INSERT INTO myTable (id, text) VALUES ($id, 'foo')");
// $id は、挿入されたデータの id フィールドの値と等しくなります
$id = $mdb2->getAfterID($id, 'myTable', 'id');
if (PEAR::isError($id)) {
die($id->getMessage());
}
?>