首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自Java的MySQL :使用PreparedStatement插入查询参数插入默认值

问来自Java的MySQL :使用PreparedStatement插入查询参数插入默认值
EN

Stack Overflow用户
提问于 2017-06-19 13:55:40
回答 2查看 2.1K关注 0票数 1

给定一个具有默认值的字段的表,比如这里的something:

代码语言:javascript
复制
CREATE TABLE foo (
    time DATETIME PRIMARY KEY,
    something CHAR (16) DEFAULT 'a default',
);

..。一份事先准备好的声明如下:

代码语言:javascript
复制
INSERT INTO foo (time, something) VALUES (?, ?)

然后如何选择插入something的默认值?

我知道我可以通过省略这个领域来得到它。但是,在我的示例中,我希望在同一个查询中设置某些记录中的值,并让数据库插入在其他记录中配置为默认值的任何内容。

下面是一个示例代码片段:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-20 11:18:47

一个可行的解决方案似乎是构造查询,使用MySQL、COALESCE()和DEFAULT()函数将空值映射为默认值。因此,重写示例insert查询如下:

代码语言:javascript
复制
INSERT INTO foo (time, something) VALUES (?, COALESCE(?, DEFAULT(something)))

然后,如果我们在第二个参数中插入null,它将相反地插入默认值(当然,这也可能是null):

代码语言:javascript
复制
// ...
    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()中命名的字段必须具有默认定义,否则即使没有使用默认值,也会出现错误。

票数 1
EN

Stack Overflow用户

发布于 2017-06-19 13:57:29

不要在INSERT状态中指定字段,则将使用默认值。

插入foo (time)值(?);

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44632546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档