【SQLiteメモ】DEFAULT制約を使ってINSERT時に自動でタイムスタンプを設定する。

CREATE TABLE GPS_Logger (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    CREATOR TEXT,
    TIMESTAMP VARCHAR(19)
    )

今まで、SQLiteで何かのデータを保存する場合、上のようなテーブルを作って、TIMESTAMPには自力で値を設定してました。

今日調べ物をしていて気がついたのですが、DEFAULT制約というのがあるんですね。

デフォルト値を設定できるんですけど、

DEFAULT制約 – テーブルの作成 – SQLite入門

上記のサイトを参考にテーブルを作りなおすと

CREATE TABLE GPS_Logger (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    CREATOR TEXT,
    TIMESTAMP TIMESTAMP CURRENT_TIMESTAMP 
    )

名前も型もTIMESTAMPで紛らわしいですが、型はTEXT、VARCHAR(19)、TIMESTAMPのどれでもいいです。
AUTOINCREMENT制約は付けても付けなくてもPRIMARY KEYならINSERTする度に自動でIDをインクリメントしていきますが、AUTOINCREMENT制約をつけているとレコードが削除されても、同じIDを振ってしまうことがありません。

これで、INSERT時に値を指定しなければTIMESTAMPにはタイムスタンプが自動で指定されます。ただしUTCです。

CURRENT_TIME         HH:MM:SS
CURRENT_DATE         YYYY-MM-DD
CURRENT_TIMESTAMP    YYYY-MM-DD HH:MM:SS

DEFAULT成約時は上記の指定できるようです。ただしUTCです。

やはりタイムゾーンをローカルのタイムゾーンで利用したい場合もありますよね。調べてみました。下記サイト様を参考にしました。

90H Tech: SQLiteでTIMESTAMP列のデフォルト値のタイムゾーンをJSTにする

CREATE TABLE GPS_Logger (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    CREATOR TEXT,
    TIMESTAMP TIMESTAMP DEFAULT (DATETIME(‘now’,’localtime’))
    )

ローカルタイムで利用したい場合上記の様になります。

CURRENT_TIMEやCURRENT_DATEについても同様にローカルのタイムゾーンで処理したい場合はdeteやtime関数を使えばできると思います。

日時の処理 – KUMA TYPE

    $hst = $dbh->prepare(‘INSERT INTO GPS_Logger VALUES(null,?,null)’);
    $retval = $hst->execute($creator);

で、cgiからDBIで利用した時にprepareの指定を上のように指定たのですが、うまくいきませんでした。値が設定されません。項目を削るとエラーになるし、指定しないってどうしたらいいんだろう?と思ってしばらく悩みましたが、

    $hst = $dbh->prepare(‘INSERT INTO GPS_Logger(CREATOR) VALUES(?)’);
    $retval = $hst->execute($creator);

こうすればよかったんですね、INSERT文の基本的な構文を忘れてしまってました。アホですね。

又ひとつかしこくなりましたw。

タグ : ,