SQLite中CURRENT_TIMESTAMP被识别为字符串字面量的问题排查
问题原因及解决方案
核心问题:字段类型不匹配
SQLite对CURRENT_TIMESTAMP这类时间默认值的识别有严格的字段类型要求:只有字段类型为TIMESTAMP、DATETIME或INTEGER时,才会将CURRENT_TIMESTAMP解析为函数调用,自动生成时间戳。你将created_at设为text类型,SQLite会直接把CURRENT_TIMESTAMP当作普通字符串存储,不会执行函数计算。
同理,datetime()、strftime()这类函数作为默认值时,若字段类型为text,也会被当作字符串字面量处理,无法触发函数执行。
修复方案
方案1:使用时间专用字段类型(推荐)
将created_at的类型改为TIMESTAMP,SQLite会自动处理时间戳的生成与存储:
CREATE TABLE `table` ( `id` text PRIMARY KEY, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL );
方案2:显式用函数调用(适合必须用text类型的场景)
如果需要保持text类型,必须用括号包裹函数调用,明确告知SQLite这是函数执行而非字符串:
CREATE TABLE `table` ( `id` text PRIMARY KEY, `created_at` text DEFAULT (datetime('now')) NOT NULL );
Turso(基于libsql)遵循SQLite的语法规则,所以以上方案在Turso和SQLite在线环境中都能生效。
内容的提问来源于stack exchange,提问作者Pramus
相关产品推荐
相关产品推荐

