SQLiteでトリガー(4)
CREATE TABLE 時のDEFAULT指定ってあったよな、と思って、これを使えば登録日のほうのトリガーは要らないかも?と思ったんだが、こちらにはUTC固定のCURRENT_TIMESTAMPとかしか使えないということだった、はず。
- SQLiteのCURRENT_TIMESTAMPのタイムゾーンはUTC固定っぽい – nplll: Mutter
- 続・SQLiteのトリガとか – オープンソースなアウトラインプロセッサを一から作る日記
- CREATE TABLE文に関数を入れるのはダメなようです
- [sqlite] Default Column Value to Local Time
これをローカルタイムに変換するにはdatetime()関数を使って、datetime(CURRENT_TIMESTAMP または ‘now’, ‘localtime’)などとしないといけないんだが、次のようにCREATE TABLEで実際に試してみるとエラーが出る。(保存時にエラーになる問題のため一時的にSE_T, WHER_E, FRO_M, INT_Oなどと表記してます。了承下さいm(__)m)
sqlite> CREATE TABLE foo (id INTEGER PRIMARY KEY, name TEXT, regist DATETIME DEFAULT datetime('now','localtime'), modified DATETIME); SQL error: near "(": syntax error
ところが、ふと思いついて関数の呼び出し箇所を括弧で括ってみたら動作してしまった!(なぜかここではTABL_Eも書き換えしないとエラーになってしまう…)
sqlite> CREATE TABL_E foo (id INTEGER PRIMARY KEY, name TEXT, regist DATETIME DEFAULT (datetime('now','localtime')), modified DATETIME); sqlite> INSERT INT_O foo (name) VALUES ('taro'); sqlite> SELECT * FRO_M foo; 1|taro|2009-12-28 14:19:46|
上記はSQLite3でのものだが、SQLite2で試すと「SQL error: near “(“: syntax error」のままだった。SQLite3で可能になった記述のようだ。
これはSQLite上正しい動作なのかな?それなら、今後も安心して使えるんだが。(続く)