如何使用SQL向App.settings表插入数据?我的语句是否正确?
你的INSERT语句问题分析&修复方案
嘿,咱们来拆解下你遇到的问题:你的插入语句执行报错,主要是两个核心原因导致的:
1. 省略字段列表的隐患 + DEFAULT关键字的误用
首先,你没在INSERT语句里指定要插入的字段列表——虽然目前你的值顺序和表结构的字段顺序刚好匹配,但这种写法非常脆弱,哪天表结构调整(比如新增字段、调整字段顺序),这条语句直接就会失效。
其次,问题的关键出在DEFAULT上:看你的表结构,email_frequency字段的默认值是NULL(且允许为NULL),但MySQL在严格模式(这是5.7版本之后的默认运行模式)下,对没有显式定义默认值的字段使用DEFAULT会触发报错——因为MySQL会认为你要调用字段的预设默认值,但这个字段只有隐式的NULL默认值,严格模式下不允许这样的写法。
正确的写法有两种,优先推荐第一种:
写法一:显式指定字段列表(强烈推荐)
这种写法最稳妥,不管后续表结构怎么变化,只要目标字段存在,语句就能正常工作:
INSERT INTO App.settings (user_id, email_frequency, layout, updated_at) VALUES(99, NULL, 'horizontal', '2015-09-15 04:01:04');
如果之后你给email_frequency设置了明确的默认值(比如1代表每周发送一次),那再把NULL换成DEFAULT就可以正常使用了:
INSERT INTO App.settings (user_id, email_frequency, layout, updated_at) VALUES(99, DEFAULT, 'horizontal', '2015-09-15 04:01:04');
写法二:保留原结构但替换DEFAULT为NULL
要是你暂时不想调整字段列表的写法,直接把DEFAULT换成NULL就行,因为这个字段本身允许为空:
INSERT INTO App.settings VALUES(99, NULL, 'horizontal', '2015-09-15 04:01:04');
小提醒
以后写INSERT语句尽量都显式指定字段列表,这是开发者公认的最佳实践,能避免很多莫名其妙的问题。另外可以查下你的MySQL sql_mode设置,如果是严格模式,记得别对没设显式默认值的字段用DEFAULT哦。
内容的提问来源于stack exchange,提问作者RuskiCode
相关产品推荐
相关产品推荐

