You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite新增默认值含换行符的列报错解决方法

问题原因

SQLite 对ALTER TABLE ADD COLUMN的默认值语法有严格限制,DEFAULT关键字后仅允许直接写常量字面量、NULL,或是CURRENT_TIME/CURRENT_DATE/CURRENT_TIMESTAMP三个特殊时间关键字,不支持任何表达式(哪怕是多个常量拼接的表达式):

  • 第一种写法直接写||拼接,解析器会认为默认值在第一个字符串处就已经结束,后续的拼接运算符属于非法语法,因此报syntax error near "||"。
  • 第二种写法加括号后,SQLite会识别到括号内是一个表达式,判定为非常量默认值,因此报Cannot add a column with non-constant default。

你在SELECT语句中可以正常使用拼接语法,是因为SELECT子句对表达式没有这类限制,和ALTER TABLE的语法规则不通用。

正确解法

直接在DEFAULT后的字符串字面量中嵌入实际换行符即可,字符串本身是常量字面量,完全符合语法要求:

ALTER TABLE customer
ADD mailfooter TEXT NOT NULL DEFAULT 'With best regards
Superdupa Company';

执行后该列的默认值就和预期完全一致,换行符会被正确保留。

如果是在代码中拼接SQL语句不方便直接写入裸换行,可以在程序代码层先把换行符拼接到字符串内容中,再作为常量传入SQL执行,不要在SQL语句内用||做拼接。

如果一定要在纯SQL语句内避免裸换行,也可以直接写整个字符串的十六进制字面量(可读性较差,不推荐):

-- 十六进制内容对应"With best regards\nSuperdupa Company"
ALTER TABLE customer
ADD mailfooter TEXT NOT NULL DEFAULT x'57697468206265737420726567617264730a53757065726475706120436f6d70616e79';

内容的提问来源于stack exchange,提问作者hslin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:33:25