首先,在 SQLite 的天下里,【CURRENT_TIMESTAMP()】返回的是 UTC 的韶光戳,以是如果想要记录本地韶光,你得先用 DATETIME 函数,用【DATETIME(CURRENT_TIMESTAMP, 'localtime')】转一道。
然后,你如果想当然地写【DEFAULT DATETIME(CURRENT_TIMESTAMP, 'localtime')】,就会直接报错!
翻查了半天才创造,在 SQLite 的天下里,所有函数都必须用小括号圈起来!
以是说,想要设置默认的韶光戳、且是本地韶光,就得老诚笃实写成【DEFAULT (DATETIME(CURRENT_TIMESTAMP, 'localtime'))】。在 Navicat 里的「默认」栏里,也得把括号打上。就问你惊不惊喜、意不虞外?

在SQLite里设置默认韶光戳
在Navicat中设置默认韶光戳
设置自动更新的修正韶光在 MySQL 里,对付类型为韶光戳的数据栏,只要大略地设置【ON UPDATE CURRENT_TIMESTAMP】,每次数据行有变动时,这个韶光戳就会自动更新为当前韶光,切实其实不要太方便。但在 SQLite 的天下里,事情就没那么大略了。
简而言之,SQLite 没有这种捷径,想要实现,只能创建触发器(TRIGGER)——顿时以为这个天下好不真实……
先贴一张官方的创建触发器的语法图,你们感想熏染一下:
创建触发器(CREATE TRIGGER)的语法
眼尖的你可能会创造,语法中有个【FOR EACH ROW】,彷佛在【AFTER UPDATE OF】后面就不用把所有数据栏的名称逐一写上了?太天真了!
【FOR EACH ROW】也包括这个须要自动更新的「修正韶光」,这样写的话,每次更新完「修正韶光」,这个触发器就会立即产生发火,从而陷入万劫不复的去世循环之中。
以是,须要追加一个限定条件【WHEN NEW.mtime = OLD.mtime】,意思是说,仅当 mtime 没变革的时候,触发器才有效。如果是 mtime 发生变革,则不会引发触发器的动作。此处用 NEW 和 OLD 差异触发器生效前后的比拟。
UPDATE 语句同时须要添加【WHERE aid = OLD.aid】,表示 UPDATE 动作所浸染的数据行,是触发器生效前数据发生变革的那一行。
CREATE TRIGGER a_mtime AFTER UPDATE ON a FOR EACH ROW WHEN NEW.mtime = OLD.mtimeBEGIN UPDATE a SET mtime = (DATETIME(CURRENT_TIMESTAMP, 'localtime')) WHERE aid = OLD.aid;END
查看数据库里已创建的触发器
触发器保存在一个名为 sqlite_master 的数据表里,且 type = 'trigger',代码则保存在 sql 数据栏里。如下图所示:
sqlite_master 表的数据构造
因此,查看全体数据库中共有多少个触发器,只需【SELECT name FROM sqlite_master WHERE type = 'trigger';】。而查看某个触发器的代码,只需【SELECT sql FROM sqlite_master WHERE name = 'trigger_name';】
觉得触发器这玩意儿还挺难,得多练习一下,巩固一下知识点才行。