【问题标题】:Oracle 9.2 migrated to 11g - Default valuesOracle 9.2 迁移到 11g - 默认值
【发布时间】:2012-07-27 13:21:22
【问题描述】:

我们最近从 Oracle 9.2 版迁移到了 11g。 但是使用数据库的应用程序出现了一些错误。我们得到以下异常:

ORA-01400: cannot insert null into...

我查找了有关该错误的信息,尤其是有关 11g 版本中的一些新功能的信息。

我来了。我知道用默认值定义表列的旧方法行不通,但我不知道为什么,更重要的是如何解决这个问题。

这是我可以使用 SQL Developer 看到的表的定义:

COLUMN_NAME         DATA_TYPE       NULLABLE      DATA_DEFAULT   COLUMN_ID
--------------------------------------------------------------------------
...
REP_DOC_RECEIVED    CHAR(1 BYTE)    No            'n'            12 
...

当我尝试为该列插入具有空值的行时,会引发异常。

【问题讨论】:

  • 该列显示可空:不,这可能是您不能在该列中插入空值的原因...默认值不是自动的,您仍然需要填充该值。什么也没有变。在该列中添加触发器或不指定该列。
  • @Ben:我不这么认为:默认值不是自动的,您仍然需要填充该值。,实际上是相反的,请参阅我的回答。
  • @gwu,也许措辞不佳......

标签: oracle11g default-value oracle9i


【解决方案1】:

仅当在插入语句中提供 no 值时,才适用默认值。所以我猜你的插入会产生一些insert into ... values ( ... , NULL, ...)

查看例如 http://sqlfiddle.com/#!4/cd58c/7 以显示差异:

-- ok
insert into a (n,REP_DOC_RECEIVED) values (1,'A');

-- ok, default is applied    
insert into a (n) values (1);

-- not ok, NOT NULL constraint violated    
insert into a (n,REP_DOC_RECEIVED) values (1,'');

您必须在插入语句中执行NVL(...,'n') 或省略该列。不,这在 11g 中没有改变。

【讨论】:

  • 感谢您的演示。迁移是我的第一个想法,但真正的问题是我们的数据库需要唯一的列名,我添加了一些列名已经存在于其他表中的表 => 错误。但是我不知道为什么数据库需要唯一的列名,但这是另一个问题。
猜你喜欢
  • 2012-09-02
  • 1970-01-01
  • 2016-12-25
  • 2013-11-10
  • 1970-01-01
  • 2016-10-06
  • 2016-06-20
  • 1970-01-01
  • 2016-05-14
相关资源
最近更新 更多