MySQL INSERT语句未硬编码主键id报错id can't be null如何解决
解决方案
错误根本原因
你的「id can't be null」报错核心是testingTable表的主键id字段没有开启**AUTO_INCREMENT(自增)**属性:主键默认带有非空约束,没有自增属性的情况下,MySQL不会自动生成主键值,你不传id、或者传null都会触发非空约束报错。
两步解决问题
第一步:修改表结构给id添加自增属性
在MySQL Workbench中执行以下SQL修改表结构,注意把字段类型替换为你实际的id字段类型(INT/BIGINT等):
-- 如果id还没有设为主键,执行这句 ALTER TABLE testingTable MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT; -- 如果已经设过主键,执行这句即可 ALTER TABLE testingTable MODIFY COLUMN id INT AUTO_INCREMENT;
你也可以在Workbench的表设计界面,勾选id字段的「AI(Auto Increment)」复选框后保存表结构。
第二步:修正C#插入代码
你的原有代码有两个错误:
- 插入操作用了
ExecuteReader():该方法是用来执行查询返回结果集的,写入操作要用ExecuteNonQuery() - 用字符串插值拼接SQL:容易引发SQL注入风险,且容易出现日期、特殊字符格式错误,推荐用参数化查询
修正后的代码示例:
MySqlCommand cmd = new MySqlCommand("insert into testingTable (value1, value2, value3) values (@v1, @v2, @v3)", connection); // 参数化赋值 cmd.Parameters.AddWithValue("@v1", "test"); cmd.Parameters.AddWithValue("@v2", new DateTime(2021,1,1)); cmd.Parameters.AddWithValue("@v3", 9); connection.Open(); // 写入操作调用ExecuteNonQuery cmd.ExecuteNonQuery(); connection.Close();
你之前三种写法报错的原因说明
- 写id字段传null:主键非空约束,没有自增属性时MySQL不接受null作为主键值
- 省略id字段:没有自增属性时,所有非空且无默认值的字段必须显式传值,id不符合要求触发报错
- 省略字段列表直接传值:表总共有4个字段,你只传3个值,字段数量不匹配直接报错,该写法本身不推荐,表结构变更后会直接失效
内容的提问来源于stack exchange,提问作者user16034084
相关产品推荐
相关产品推荐

