ECCUBE 2.13.x系のテーブルを見ると、
「_id_seq」で終わるテーブルがある。
各テーブルで主キーに「Audo_Incliment」を指定すれば良いもののを、
あえて、テーブルで管理している。
まあ、いいんだけど、この_id_seqで終わるテーブルが、
以外に多くて、テーブルを探すときに、邪魔・・・
***
ということで、
すで、Eccube 3.x系が主流なので、移行すべきなところはさておき、
これらのシーケンステーブルを削除し、1つのテーブルにまとめてみた。
新たに作成したテーブルは、「_sequence」とし、
項目は、以下の通りである。
- seqeuence_name [varchar(64)] :シーケンス名
- sequence[int]:
- updated[datetime]: 保守用最終更新時刻
SC_Query_Exで、クラスを拡張したのが、以下のコードで、
「_sequence」というテーブルがあるときのみ、作動する。
※シーケンス名が存在するかも、チェックしたほうがいい。
ポイント
$this->conn->nextID で、値を拾ってきているのに対し、
nextValを使っているコードを、すべて書き直すわけではなく、
nextVal内での取扱い、
「_sequence」へ個別にupdate / selectしているだけなので、
コードの修正は、最小限となっております!
<?php
require_once CLASS_REALDIR . 'SC_Query.php';
class SC_Query_Ex extends SC_Query
{
/**
* 次のシーケンス値を取得する.
*
* @param string $seq_name 取得するシーケンス名
* @param integer 次のシーケンス値
*/
public function nextVal($seq_name)
{
$nextID = $this->conn->nextID($seq_name); // 元に戻すときのために、実行
// 試験中
if ($ret = $this->query("show tables like '_sequence'")) {
//
$this->update('_sequence',
array('sequence' => 'sequence + 1', 'updated' => 'now()'),
"sequence_name = '$seq_name'");
$_ = $this->currVal($seq_name);
if (empty($_)) {
// レコードが無いとき
$this->insert('_sequence', array($seq_name, $nextID));
return $nextID;
}
} else
return $this->conn->nextID($seq_name);
}
/**
* 現在のシーケンス値を取得する.
*
* @param string $seq_name 取得するシーケンス名
* @return integer 現在のシーケンス値
*/
public function currVal($seq_name)
{
// 試験中
if ($ret = $this->query("show tables like '_sequence'")) {
//
$ret = $this->select('sequence', '_sequence', "sequence_name = '$seq_name'");
var_dump($seq_name. ': '. $ret[0]['sequence']);
return $ret[0]['sequence'];
} else
return $this->conn->currID($seq_name);
}
}
※動作確認したが、実運用はしていない状態のコードなので、要修正
一応、動くは動くものの、
1日1万件の処理とかになると、耐久性には心配が残ります。
ECCUBE 2.13.x シーケンステーブル
