シーケンスとは、データの行に一意な 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')");
?>
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() で変更できます。
AUTO_INCREMENT を使用するほうがお好みなら、 lastInsertID() メソッドを使用して 直近に作成された値を取得するという方法もあります。このメソッドは、 PostgreSQL の SERIAL 型の書式を使用して現在のシーケンス ID を取得することもサポートしています。 MDB2 は、自動インクリメントをサポートしていない RDBMS に対してその振る舞いをエミュレートすることができます。 そのためには、 createTable() メソッドを使用してテーブルを作成します。
lastInsertID() の使用法
<?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());
}
?>
シーケンスの現在の値を取得するには、 currID() メソッドを使用します。
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());
}
?>