Ktor操作MySQL插入数据遇问题:多字段插入失败及字段报错
MySQL 插入数据问题解决方案
一、PreparedStatement setXxx方法的正确用法
JDBC的PreparedStatement的setXxx系列方法确实仅支持每次设置一个占位符的值,无法一次性传入多个参数。你需要先编写包含对应占位符的插入SQL,再依次调用setXxx方法为每个占位符赋值,注意占位符的索引从1开始,而非0。
示例SQL与代码:
// 编写包含所有需要插入字段的SQL,每个字段对应一个?占位符 String insertSql = "INSERT INTO client (id, name, age) VALUES (?, ?, ?)"; PreparedStatement pstmt = conn.prepareStatement(insertSql); // 按占位符顺序依次赋值 pstmt.setInt(1, 1); // 第一个?对应id字段 pstmt.setString(2, "Mike"); // 第二个?对应name字段 pstmt.setInt(3, 25); // 第三个?对应age字段 // 执行插入 pstmt.executeUpdate();
二、解决"Field 'name' doesn't have a default value"报错
这个报错的核心原因是:你的name字段被设置为NOT NULL且未配置默认值,但插入操作时没有给该字段赋值。常见触发场景和解决办法:
1. SQL语句遗漏name字段
如果你的SQL写成了INSERT INTO client (id, age) VALUES (?, ?),数据库会尝试给name字段填充默认值,但由于该字段无默认值且非空,直接报错。解决办法:确保SQL的字段列表包含所有非空且无默认值的字段(比如这里的name)。
2. setXxx方法调用错误
可能是占位符索引与字段不匹配,或者漏调了setString方法给name赋值。比如误将name的占位符索引写成3,而实际对应第二个位置,导致name未被赋值。解决办法:核对SQL中字段的顺序与setXxx调用的索引严格对应。
3. 表结构问题
如果你的表结构中name字段是NOT NULL但无默认值,且业务上允许该字段为空,可以修改表结构:
ALTER TABLE client MODIFY COLUMN name VARCHAR(50) DEFAULT '' NULL;
如果业务要求name必须有值,则必须确保每次插入都为name字段赋值。
内容的提问来源于stack exchange,提问作者Equlo
相关产品推荐
相关产品推荐

