我正在尝试将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约束,但它给出了相同的错误。有没有办法做到这一点,没有重新创建整个表?
答案 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>