【问题标题】:Oracle: Insert into table(column_list) values(values_list) with some columns defined as default NULLOracle:插入表(column_list)值(values_list),其中一些列定义为默认NULL
【发布时间】:2014-09-05 08:45:32
【问题描述】:

假设您有这个 Oracle 11g 表:

table sample(
  mykey int, --primary key
  myval varchar2(10 byte) not null,
  col1 varchar2(10 byte),
  col2 varchar2(10 byte) default NULL)

如果你从 sqldeveloper 执行这个语句,例如:

insert into sample(mykey, myval) values (1, 'test');

你得到

mykey    myval   col1    col2
1        test    null    null

请注意,两个可空列是否指定“默认空值”并没有什么区别,您仍然会为您输入“空值”作为值。

现在,为什么来自 JDBC 驱动程序的完全相同的插入会失败并出现“没有足够的值”错误?

此外,如果定义列 col2 时没有“默认 null”,但仍然可以为空,则 JDBC 插入工作并为 col1 和 col2 设置“null”。

为一列指定“默认空值”是多余的还是完全错误的?如果 Oracle 允许我使用该默认值创建列并允许我编写正确插入示例中的 SQL 代码,我认为这样做没有错误/非法。

这是否与 Oracle 数据库(或与此相关的任何数据库)有关,或者通过 JDBC 驱动程序插入的应用程序是否发出了错误的语句?

提前致谢

【问题讨论】:

  • 你能显示你的jdbc代码吗
  • @Joram - 抱歉,如果我拥有它,我会发布它。我正在使用 TIBCO BusinessWorks,所以我面前没有实际的 Java 代码,但最终结果是 JDBC 插入。我只是想知道指定“默认 null”是否错误/是否会导致 Oracle 出现问题,如果问题出在其他地方

标签: sql oracle jdbc


【解决方案1】:

为一列指定“默认空值”是多余的还是完全错误的?

是的,这是多余的。如果您不指定默认值,则暗示 DEFAULT NULL。

毕竟这是唯一明智的行为:如果您不提供值,唯一可能的选择是在该列中存储“未知”。这正是NULL 的意思:是否存在价值是未知的。

现在,为什么来自 JDBC 驱动程序的完全相同的插入会失败并出现“没有足够的值”错误?

我不认为您在 Java 程序中使用了 完全相同 语句。 “没有足够的值”错误仅在您 - 好吧 - 没有提供足够的值时才会出现。例如。通过在values 子句中提供的值少于insert 部分中的列。以下语句将导致该错误:

insert into sample(mykey, myval, col1) values (1, 'test');

我没试过,但是可能类似下面的东西也会导致这个错误:

PreparedStatement pstmt = connection.prepareStatement("insert into sample(mykey, myval, col1, col2) values (?,?,?,?)");
pstmt.setInt(1, 1),
pstmt.setString(2, 'test');

请注意,第三列没有调用setXXX()。

【讨论】:

  • 谢谢你,就这样。如果它只是多余的,而不是非法/错误的,那么问题不在于 Oracle 方面。
  • 澄清一下,我传递了足够多的值;如果我声明两列可为空但未设置默认值,则该语句有效,而如果我将“默认空”添加到其中一个列并尝试传递完全相同的值(没有重复的键问题等,因为表是)每次重试前清空)
  • @grog:要理解这种行为,我们需要查看生成 INSERT 语句的 Java 代码。这当然不是在 Oracle 方面造成的。
【解决方案2】:

我相信 JDBC 会创建类似于以下的 SQL:

insert into sample(mykey, myval, col1, col2 ) values (?, ?, ?, ?);

只是说,我不是JAVA,所以参数可能写得不同。

话虽如此,您的客户需要 4 个值,而不仅仅是 2 个。它不会知道您可能只想传递一组特定的列。

【讨论】:

  • 抱歉,我的客户不希望有 4 个值,这就是我们有可空列的原因。我执行的 JDBC 插入是: insert into sample(mykey, myval) values (?, ?);这是合法的并且可以正确执行。问题是,如果我为可空列之一指定“默认空值”,它会失败。我只是想确定这是否是 Oracle 问题。
猜你喜欢
  • 2011-07-20
  • 2016-08-30
  • 2014-11-19
  • 1970-01-01
  • 2014-11-12
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多