Field 'OPINION' doesn't have a default value

本文探讨了在MySQL中使用Java程序插入数据时遇到的异常问题:字段'OPINION'没有默认值。介绍了严格模式下MySQL如何处理未指定值的情况,并讨论了如何避免此类错误。

mysql 和 一段java程序插入一条记录
java程序的话有异常抛出,不能插入.

 

java.sql.SQLException: Field 'OPINION' doesn't have a default value
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946)
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
 at com.mysql.jdbc.Connection.execSQL(Connection.java:3170)
 at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1316)
 at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1235)
 at include.nseer_db.nseer_db_backup1.executeUpdate(nseer_db_backup1.java:97)
 at crm.file.register_ok.doPost(register_ok.java:108)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
 at include.anti_repeat_submit.SubmitFilter.doFilter(SubmitFilter.java:66)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
 at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
 at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
 at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
 at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
 at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
 at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
 at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
 at java.lang.Thread.run(Thread.java:595)

 

 

 

数据库的默认模式已经不是strict mode, 但还是抛出异常了。

 

 

As of MySQL 5.0.2, if a column definition includes no explicit DEFAULT value, MySQL determines the default value as follows:

If the column can take NULL as a value, the column is defined with an explicit DEFAULT NULL clause. This is the same as before 5.0.2.

If the column cannot take NULL as the value, MySQL defines the column with no explicit DEFAULT clause. For data entry, if an INSERT or REPLACE statement includes no value for the column, MySQL handles the column according to the SQL mode in effect at the time:

If strict SQL mode is not enabled, MySQL sets the column to the implicit default value for the column data type.

If strict mode is enabled, an error occurs for transactional tables and the statement is rolled back. For non-transactional tables, an error occurs, but if this happens for the second or subsequent row of a multiple-row statement, the preceding rows will have been inserted.

MySQL 中,当尝试插入数据时,如果遇到 `Field doesn't have a default value` 错误,通常是因为插入语句中未指定某个字段的值,而该字段又没有设置默认值(`DEFAULT`),并且该字段定义为 `NOT NULL`。MySQL 在严格模式下会阻止这种插入行为,以确保数据完整性。 为了解决该问题,可以从以下几个方面进行调整: ### 3.1 修改字段定义,设置默认值 可以通过 `ALTER TABLE` 语句为字段添加默认值。例如,若字段 `status` 是 `INT NOT NULL` 类型,但未设置默认值,可执行以下 SQL: ```sql ALTER TABLE your_table ALTER COLUMN status SET DEFAULT 0; ``` 这样在插入数据时,即使未指定 `status` 字段的值,数据库也会自动使用默认值 `0` 进行填充[^1]。 ### 3.2 允许字段为 NULL 如果业务逻辑允许字段为空,可以将字段改为 `NULL` 类型,并设置默认值为 `NULL`: ```sql ALTER TABLE your_table MODIFY COLUMN status INT NULL DEFAULT NULL; ``` 这样在插入数据时,若未指定该字段,数据库将自动填充为 `NULL`,而不会报错[^1]。 ### 3.3 插入语句中显式赋值 确保在插入语句中对所有 `NOT NULL` 字段都进行了赋值。例如: ```sql INSERT INTO your_table (id, name, status) VALUES (1, 'test', 1); ``` 若省略了 `status` 字段且该字段没有默认值,则会触发 `Field doesn't have a default value` 错误。 ### 3.4 调整 MySQL 模式(谨慎操作) 如果希望 MySQL 在插入数据时忽略未指定字段的错误,可以临时关闭严格模式。编辑 MySQL 配置文件 `my.cnf` 或 `my.ini`,修改 `sql_mode` 设置,去掉 `STRICT_TRANS_TABLES` 或 `STRICT_ALL_TABLES`: ```ini sql_mode = NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION ``` 重启 MySQL 服务后生效。这种方式适用于开发或测试环境,在生产环境中不建议关闭严格模式,以免影响数据一致性[^1]。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值