有没有办法将 SQL 参数的默认值设置为空?

Posted

技术标签:

【中文标题】有没有办法将 SQL 参数的默认值设置为空?【英文标题】:Is there way to set default as null for SQL parameter? 【发布时间】:2020-08-21 18:21:54 【问题描述】:

我有一个使用 MapSqlParameterSource 创建 sql 参数的代码。这是我的代码:

MapSqlParameterSource parameters = new MapSqlParameterSource()
            .addValue(EVENT_ID, eventId)
            .addValue(TYPE, type.toString())
            .addValue(ACCOUNT_ID, null)
            .addValue(USER_ID, null);
        if (Type.SPOOFER_USER == type) 
            parameters.addValue(USER_ID, account.getUser().getId());
        
        else 
            parameters.addValue(ACCOUNT_ID, account.getId());
        

基本上,如果帐户类型是欺骗者,我必须有用户 ID 而不是帐户 ID。但是,我不喜欢在实例化parameters 时必须将account_iduser_id 设置为null。有没有办法将account_iduser_id 设置为null,这样我就不必写这两行了?:

MapSqlParameterSource parameters = new MapSqlParameterSource()
            .addValue(EVENT_ID, eventId)
            .addValue(TYPE, type.toString())
            .addValue(ACCOUNT_ID, null) //////////////////////////THIS ONE
            .addValue(USER_ID, null);   //////////////////////////AND THIS ONE

这是我的 sql 查询:

INSERT INTO database (id, event_id, type, account_id, user_id)
    VALUES (database.nextval, :event_id, :type, :account_id, :user_id)

更新:

也许我的问题不够具体。当我跑步时会发生什么

jdbcTemplate.update(insertEventExtra, parameters);

在没有将它们设为“NULL”的情况下,我在单元测试中得到了这个异常:

org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter 'user_id': No value registered for key 'user_id'

我使用 hsql 来测试它。我的 .sql 看起来像这样:

...
ID NUMBER(38,0) PRIMARY KEY,
EVENT_ID BIGINT NOT NULL,
TYPE VARCHAR2(20 BYTE) NOT NULL,
ACCOUNT_ID NUMBER(38,0),
GROUP_ID NUMBER(38,0),
USER_ID NUMBER(38,0),
...

所以我的具体问题是,当我尝试使用参数运行测试而不将它们设置为 null 时,我的测试给了我异常。

【问题讨论】:

只是不要在插入过程中设置它们。它们默认为 null。 可能我对这里发生的事情一无所知,我的问题是,如果您在创建参数时仅删除两行并稍后添加,如您所示,会出现什么问题? 【参考方案1】:

您必须包含 addValue(ACCOUNT_ID, null) 和 addValue(USER_ID, null),因为您的 INSERT 语句包含两个命名参数 :account_id:user_id

框架尝试从MapSqlParameterSource 对象中提取命名参数的值,当它没有找到其中之一时,它会抛出异常。这样做是为了避免用户错误,因为如果您不打算为参数提供值,则不会在 INSERT 语句中包含该参数。

【讨论】:

哦,所以它是为了抛出错误而设计的。如果我坚持使用MapSqlParameterSource,我想我没有太多选择。谢谢。【参考方案2】:

使您的列可以为空,并在数据库架构中默认为空。那么,如果在插入的时候没有为某列指定值,那么它应该默认为null

【讨论】:

【参考方案3】:

默认情况下,所有非空列的默认值为 NULL,除非您在插入或更新列时提供值。

【讨论】:

以上是关于有没有办法将 SQL 参数的默认值设置为空?的主要内容,如果未能解决你的问题,请参考以下文章

如果请求值为空,Laravel 设置默认值

如何将微调器中的第一个值(默认值)设置为空

如何在sql server中创建一个存储过程中的varchar型的输入参数默认值为空

如何在c ++中将前面的函数参数设置为其默认值?

寻找正确的 sql 语法以将默认值添加到现有表

是否可以为 DTO 设置默认值?