firebirdというオープンソースのデータベースを使ってみた【その3】

さてさて今連載も3回目、web-teamのk2w4t4hでございます。

第1回目 firebirdというオープンソースのデータベースを使ってみた【その1】 - スマートフォンアプリ開発会社のエンジニアブログ
第2回目 firebirdというオープンソースのデータベースを使ってみた【その2】 - スマートフォンアプリ開発会社のエンジニアブログ

データベースを前回作ったので、そろそろテーブルを作ろうかと思います。
基本的にはこんな感じで作ります。

CREATE TABLE GLPGS(
ID INTEGER NOT NULL PRIMARY KEY,
NAME VARCHAR(63) NOT NULL,
PASSWD VARCHAR(127) NOT NULL,
LEVEL SMALLINT NOT NULL,
UPDATED TIMESTAMP NOT NULL,
CREATED TIMESTAMP NOT NULL
);

まあ、こんなものはほぼ共通ですよねー。強いて言うなら、MySQLのdatetime的な使い方をするのがTIMESTAMPかなーというところでしょうか。MySQLのtimestampは特殊なので。

他にも、MySQLとの違いを挙げるなら、MySQLはテーブル名、カラム名を大文字小文字区別して扱います。一方のfirebirdでは、すべて大文字で扱われます。別に大文字小文字の変換ぐらい勝手にやるので、SQL文の時点で気を配る必要も特にないのですが、PHPでibase_fetch_assocとかやったときに、配列の添え字が大文字に統一されていてびっくりしたりします。

少々フライイングしましたが、PHPfirebirdを扱う際の関数はすべて「ibase_」になります。firebirdはinterbaseという商用DBから派生したためです。

おまけとして、PHPで扱う際に小文字で使いたいとかなったときの対処法を。ibase_fetch_assocにsql_fetch_assocを被せるという手抜きでご紹介しましょう。

function sql_fetch_assoc($result){
$array = ibase_fetch_assoc($result);
if(is_array($array)){
foreach($array as $key => $value){
$c_array[strtoupper($key)] = $value;
$c_array[strtolower($key)]] =$value;
}
return $c_array;
}else{
return $array;
}
}


これなら全部大文字でも、全部小文字でもOK。

脱線しました。
話を元に戻しましょう。


他にも、MySQLユーザーならauto_incrementとか欲しいですよね。Postgresならserialにあたるやつです。firebirdの場合、直接的にauto_incrementに当たるものはないですが、sequencerというものがあります。Oracleでよく使うアレです。sequencerの役割を一言で言うなら、「連番発生器」になります。

CREATE SEQUENCE GLPGS_SEQ;

これで、連番発生器を1つ用意することができます。で、insertの際に、

INSERT INTO glpgs (id,name,passwd,level,updated,created) VALUES (next value for glpgs_seq, 'root', 'passwd', 10, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

という風にやってやることで、連番になります。「next value for」という大変わかりやすい(笑)構文はいかがなものかという気もしますが、まあ気にしないことにしましょう。

値を強制的に変更したければ、

alter sequence glpgs_seq restart with 12345;

みたいにすれば変更できます。sequencerを削除したければ、

drop sequence glpgs_seq;

で削除できます。当然、glpgsというテーブルを削除したければ、

drop table glpgs;

で削除できます。


最後に、途中颯爽とスルーしましたが、MySQLで言うところのnow()、つまり現在の日時・時刻の取得はCURRENT_TIMESTAMPと入れてやればOKです。firebirdのやつは秒の下まで取れちゃいますが、ぶっちゃけ不要ですよねー。