首页 » Web前端 » phpsqlite时光技巧_SQLite3设置创建时间的默认值并运用触发器自动更新修改时间

phpsqlite时光技巧_SQLite3设置创建时间的默认值并运用触发器自动更新修改时间

访客 2024-12-07 0

扫一扫用手机浏览

文章目录 [+]

首先,在 SQLite 的天下里,【CURRENT_TIMESTAMP()】返回的是 UTC 的韶光戳,以是如果想要记录本地韶光,你得先用 DATETIME 函数,用【DATETIME(CURRENT_TIMESTAMP, 'localtime')】转一道。

然后,你如果想当然地写【DEFAULT DATETIME(CURRENT_TIMESTAMP, 'localtime')】,就会直接报错!
翻查了半天才创造,在 SQLite 的天下里,所有函数都必须用小括号圈起来!

phpsqlite时光技巧_SQLite3设置创建时间的默认值并运用触发器自动更新修改时间

以是说,想要设置默认的韶光戳、且是本地韶光,就得老诚笃实写成【DEFAULT (DATETIME(CURRENT_TIMESTAMP, 'localtime'))】。
在 Navicat 里的「默认」栏里,也得把括号打上。
就问你惊不惊喜、意不虞外?

phpsqlite时光技巧_SQLite3设置创建时间的默认值并运用触发器自动更新修改时间
(图片来自网络侵删)

在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';】

觉得触发器这玩意儿还挺难,得多练习一下,巩固一下知识点才行。

相关文章