【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関数を使えばできると思います。
$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。