2011-09-16 56 views
0

我正在嘗試向表中添加CLOB列(實際上將VARCHAR更改爲CLOB,但似乎只能通過添加新列來複制和刪除舊列)。沒有默認值的列應該是NOT NULL(並且表不是空的)。我怎樣才能做到這一點?在Oracle中添加NOT NULL LOB列沒有默認值

我最初的想法是創建一個虛擬默認列,而後來的變化,但是這似乎並不可能:

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約束後來,但它給了同樣的錯誤。有沒有辦法做到這一點,而不是重新創建整個表格?

回答

10

是否

ALTER TABLE foo MODIFY text DEFAULT NULL; 

爲你工作?

添加或刪除默認值或NOT NULL約束時,不需要指定列的數據類型。

編輯:引述Oracle documentation on ALTER TABLE

如果列有缺省值,那麼你可以使用默認的條款更改默認爲NULL,但你不能完全刪除默認值。如果某個列曾經分配過一個默認值,那麼USER_TAB_COLUMNS數據字典視圖的DATA_DEFAULT列將始終顯示默認值或NULL。

這應該解釋爲什麼你在SQL Developer中看到不同。

但是,我不相信在爲列指定DEFAULT NULL和未指定默認值之間存在顯着差異。在這兩種情況下,對於在INSERT語句中未明確給出值的任何列,都將假定爲空值。

+0

這應該工作 –

+0

這工作確實,但它留下的缺省值NULL,這是不一樣的沒有值(SQL Developer在第一種情況下顯示NULL,第二種情況下顯示爲'(null)')。差異是否微不足道? – Tgr

+0

@Tgr:看到我更新的答案。 –

3

當您將該列添加到表中時,您將該列聲明爲NOT NULL,因此您無需再次將其設置爲NOT NULL。我想如果你在最後的MODIFY子句中修正了語法,你仍然會得到一個錯誤,儘管它是一個不同的錯誤(確切的數字現在無法迴避)。

但你正在試圖acheive是絕對有可能的,用正確的語法:)

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>