2016-03-07 11 views
1

我的表table_abc中存在一個數據。not null在oracle中啓用novalidate問題

有一列CONTEXT_NAME這是非強制性的,但現在我想修改此列,並使其mandaroty

例如:

ALTER TABLE table_abc MODIFY CONTEXT_NAME VARCHAR2(240) NOT NULL; 

這將拋出一個錯誤

第1行的錯誤: ORA-02296:無法啓用(APPS。) - 發現空值

因此,我使用了無效驗證碼,如

Alter table table_abc modify CONTEXT_NAME not null enable novalidate; 

但現在,當我看到表的結構,它不顯示context_ame爲非空;

Name     Null  Type   
--------------------- -------- -------------- 
NAME     NOT NULL VARCHAR2(700) 
ITEM_DESCRIPTION    VARCHAR2(2000) 

ITEM_TEXT_TL_15    VARCHAR2(4000) 
ITEM_DESCRLONG     VARCHAR2(4000)  
CREATED_BY      VARCHAR2(64) 
CREATION_DATE     DATE   
LAST_UPDATE_DATE    DATE   
LAST_UPDATED_BY    VARCHAR2(64) 
LAST_UPDATE_LOGIN    VARCHAR2(32) 
CONTEXT_NAME     VARCHAR2(240) 
BF_NAME   VARCHAR2(264) 

Shouldnt context_name not null?

+0

您需要首先擺脫NULL值。 –

+0

我實際上是想給一個默認值..有沒有其他的懷呢?我不想觸摸現有的數據? –

回答

3

如果要添加約束,則必須更新值以符合該約束,以便意味着更新表並在現在包含null的那些行中填寫所需的默認值。

update table_abc 
set CONTEXT_NAME = '(none)' 
where CONTEXT_NAME is null 

或者,不是將列更改爲強制,而是可以向該表中添加一個觸發器來驗證值。這樣,您只能在插入或修改行時驗證數據。

create or replace trigger TABLE_ABC_IUB before insert or update 
on TABLE_ABC for each row 
begin 
    if :new.CONTEXT_NAME is null then 
    raise_application_error(-20000, 'CONTEXT_NAME is required'); 
    end if; 
end; 

這會要求您在觸摸該行時始終填寫一個值。您可以通過修改沒有CONTEXT_NAME的行開始修改條件。下面的觸發器應爲新行和從具有值更新爲NULL的行強制執行一個值。

create or replace trigger TABLE_ABC_IUB before insert or update 
on TABLE_ABC for each row 
begin 
    if :new.CONTEXT_NAME is null and (inserting or :old.CONTEXT_NAME is not null) then 
    raise_application_error(-20000, 'CONTEXT_NAME is required'); 
    end if; 
end; 

而是拋出一個異常,你當然允許只值賦給:new.CONTEXT_NAME的。

+0

@ Goleztrol-我無法根據要求更新現有值 –

+0

然後使用觸發器。 – GolezTrol

+0

@ divya.trehan573。 。 。如果你想要一個非'NULL'約束,你*有*更新現有的'NULL'值。 –