我尝试从某个列可能为NULL的Java应用程序更新表。我尝试了几种不同的方法,但我总是得到以下错误:
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: 'null' for column 'scheidingsdatum' at row 1
我确保表允许scheidingsdatum字段的NULL值,并且可以在直接插入MySQL时插入NULL值
这是PHPMyAdmin中的表结构:
表格使用innoDB
我尝试了以下解决方案:
1:只需在参数中使用NULL变量
stmnt = conn.prepareStatement("UPDATE gezinnen SET "
+ "ouder1 = ?,"
+ "ouder2 = ?,"
+ "huwelijksdatum = ?,"
+ "scheidingsdatum = ? "
+ "WHERE gezinsNummer = ?");
stmnt.setString(1, ouder1);
stmnt.setString(2, ouder2);
stmnt.setString(3, huwelijksdatum);
stmnt.setString(4, scheidingsdatum);
stmnt.setString(5, nummer);
2:查询中的硬编码为NULL(在if / else块内)
stmnt = conn.prepareStatement("UPDATE gezinnen SET "
+ "ouder1 = ?,"
+ "ouder2 = ?,"
+ "huwelijksdatum = ?,"
+ "scheidingsdatum = NULL "
+ "WHERE gezinsNummer = ?");
stmnt.setString(1, ouder1);
stmnt.setString(2, ouder2);
stmnt.setString(3, huwelijksdatum);
stmnt.setString(4, nummer);
3:使用setNull(4,java.sql.Types.DATE)
stmnt = conn.prepareStatement("UPDATE gezinnen SET "
+ "ouder1 = ?,"
+ "ouder2 = ?,"
+ "huwelijksdatum = ?,"
+ "scheidingsdatum = ? "
+ "WHERE gezinsNummer = ?");
stmnt.setString(1, ouder1);
stmnt.setString(2, ouder2);
stmnt.setString(3, huwelijksdatum);
stmnt.setNull(4, java.sql.Types.DATE);
stmnt.setString(5, nummer);
4:使用setNull(4,java.sql.Types.NULL)
stmnt = conn.prepareStatement("UPDATE gezinnen SET "
+ "ouder1 = ?,"
+ "ouder2 = ?,"
+ "huwelijksdatum = ?,"
+ "scheidingsdatum = ? "
+ "WHERE gezinsNummer = ?");
stmnt.setString(1, ouder1);
stmnt.setString(2, ouder2);
stmnt.setString(3, huwelijksdatum);
stmnt.setNull(4, java.sql.Types.NULL);
stmnt.setString(5, nummer);
以下是我的database.properties文件和连接创建:
database.properties
jdbc.drivers=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://IP:3306/TABLE_NAME
jdbc.username=USER
jdbc.password=PASSWORD
创建连接
Class.forName(props.getProperty("jdbc.drivers")).newInstance();
this.conn = (Connection) DriverManager.getConnection(props.getProperty("jdbc.url"),props.getProperty("jdbc.username"),props.getProperty("jdbc.password"));
答案 0 :(得分:4)
我刚做了一个测试,它对stmnt.setNull(4, java.sql.Types.Date);
有用,你确定stmnt.setString(3, huwelijksdatum);
huwelijksdatum的值是一个有效的mysql日期字符串而不是“null”吗?
答案 1 :(得分:3)
嗯,这是有史以来最蠢的修理。
代码最初是由其他人制作的,我只是稍微扩展了一下。他们首先创建了一个字符串scheidingsDatum = "null";
,如果有的话,它将被实际日期覆盖。
我假设(我知道,从来没有聪明的假设)当它没有值时它会为空(注意缺少引号?)。
所以,在我的检查中,字符串不是null(因为它是“null”),所以第一部分被执行了。这使得它试图插入一个字符串“null”,这显然是一个不正确的日期。
在实例化时,只需将字符串修改为null而不是“null”就可以解决问题。
答案 2 :(得分:2)
您可以在准备好的语句中尝试TIMESTAMP而不是DATE。
stmnt.setNull(4, java.sql.Types.TIMESTAMP);
答案 3 :(得分:0)
如果scheidingsdatum是一个可以为空的字段,那么只要它的值为null,就将其从UPDATE语句中删除。换句话说,当scheidingsdatum为null时,将语句更改为:
UPDATE gezinnen SET ouder1 = ?, ouder2 = ?, huwelijksdatum = ?
WHERE gezinsNummer = ?