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
相关产品推荐
相关产品推荐

