在Oracle中默认添加NOT NULL LOB列

时间:2011-09-16 10:07:52

标签: oracle

我正在尝试将CLOB列添加到表中(实际上将VARCHAR更改为CLOB,但似乎只能通过添加新列,复制和删除旧列)。如果没有默认值,该列应为NOT NULL(并且表不为空)。我怎样才能做到这一点?

我最初的想法是使用虚拟默认值创建列,稍后进行更改,但这似乎不可能:

ALTER TABLE foo RENAME COLUMN text TO text_temp;
ALTER TABLE foo ADD (
    text CLOB DEFAULT '*' NOT NULL
);
UPDATE foo SET text = text_temp;
ALTER TABLE foo DROP COLUMN text_temp;
ALTER TABLE foo MODIFY (
    text CLOB NOT NULL
);
-- ORA-22296: invalid ALTER TABLE option for conversion of LONG datatype to LOB

我还尝试将列定义为text CLOB并稍后添加NOT NULL约束,但它给出了相同的错误。有没有办法做到这一点,没有重新创建整个表?

2 个答案:

答案 0 :(得分:10)

确实

ALTER TABLE foo MODIFY text DEFAULT NULL;

为你工作?

添加或删除默认值或NOT NULL约束时,无需指定列的数据类型。

编辑:引用Oracle documentation on ALTER TABLE

  

如果列具有默认值,则可以使用DEFAULT子句将默认值更改为NULL,但不能完全删除默认值。如果列已分配了默认值,则USER_TAB_COLUMNS数据字典视图的DATA_DEFAULT列将始终显示默认值或NULL。

这可以解释为什么你在SQL Developer中看到了差异。

但是,我不认为为列指定DEFAULT NULL和指定默认值之间存在显着差异。在这两种情况下,对于未在INSERT语句中明确给出值的任何列,将假定为空值。

答案 1 :(得分:3)

当您将列添加到表中时,您将该列声明为NOT NULL,因此您无需再次将其设置为NOT NULL。我想如果你纠正了最后一个MODIFY子句中的语法,你仍会得到一个错误,虽然是一个不同的错误(现在确切的数字不在我身上)。

但是你想要实现的目标绝对是可能的,使用正确的语法:)

SQL> alter table t23 add ctxt clob
  2  /

Table altered.

SQL> update t23 set ctxt = txt
  2  /

2 rows updated.

SQL> alter table t23 modify ctxt not null
  2  /

Table altered.

SQL> alter table t23 drop column txt
  2  /

Table altered.

SQL> alter table t23 rename column ctxt to txt
  2  /

Table altered.

SQL>