给定一个具有默认值的字段的表,比如这里的something:
CREATE TABLE foo (
time DATETIME PRIMARY KEY,
something CHAR (16) DEFAULT 'a default',
);..。一份事先准备好的声明如下:
INSERT INTO foo (time, something) VALUES (?, ?)然后如何选择插入something的默认值?
我知道我可以通过省略这个领域来得到它。但是,在我的示例中,我希望在同一个查询中设置某些记录中的值,并让数据库插入在其他记录中配置为默认值的任何内容。
下面是一个示例代码片段:
String sql = "INSERT INTO foo (time, s1, s2, s3, ...) VALUES (?, ?, ?, ?, ...)";
// Many fields. You get the picture.
PreparedStatement stmt = connection.prepareStatement(sql);
connection.setAutoCommit(false);
// Insert the lines. The number of fields can change from one line to
// the next, depending on the sensors fitted at the time. The mapping
// of fields -> database values is defined by the enum Fields.
Field badField = null;
try {
for(String line: loglines) {
String loggedSensors[] = line.toString().split (",");
for(Field field : Field.values()) {
if (field.parseIndex >= loggedSensors.length) {
log.warning("using default value for absent field" +
field.columnName);
// Omitting the field generates an error.
// How do we set the field to a default here?
continue;
}
badField = field;
stmt.setObject(
field.ordinal()+1,
field.parse(loggedSensors[field.parseIndex]));
}
stmt.addBatch();
stmt.executeBatch();
}
} catch (Exception e) {
log.error("error inserting field "+badField, e);
return;
}
connection.commit();我在这里搜索并查看了文档,但没有找到任何专门针对MySQL的答案:
https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference.html
发布于 2017-06-20 11:18:47
一个可行的解决方案似乎是构造查询,使用MySQL、COALESCE()和DEFAULT()函数将空值映射为默认值。因此,重写示例insert查询如下:
INSERT INTO foo (time, something) VALUES (?, COALESCE(?, DEFAULT(something)))然后,如果我们在第二个参数中插入null,它将相反地插入默认值(当然,这也可能是null):
// ...
for(Field field : Field.values()) {
if (field.parseIndex >= loggedSensors.length) {
// MySQL permits setting null like this, other DBs may
// require #setNull(int, int)
stmt.setObject(field.ordinal()+1, null);
else
stmt.setObject(
field.ordinal()+1,
field.parse(loggedSensors[field.parseIndex]));
}
// ...可以随心所欲地推广到多个领域。尽管请注意,在DEFAULT()中命名的字段必须具有默认定义,否则即使没有使用默认值,也会出现错误。
发布于 2017-06-19 13:57:29
不要在INSERT状态中指定字段,则将使用默认值。
插入foo (time)值(?);
https://stackoverflow.com/questions/44632546
复制相似问题