2015-07-21 96 views
1

我想插入一個非空值。這是一個例子:找到空值

create table time(
a varchar2(9), 
b varchar2(9), 
c varchar2(9)); 

table create 

insert into time (a,c) values ('qq','ee'); 

table altered 

當我鍵入此:

alter table time 
modify b varchar2(9) not null; 

此錯誤出來:

alter table time 
* 
ERROR at line 1: 
ORA-02296: cannot enable (DIP0114713.) - null values found 

所以,我怎麼插入值ac列,也列b是不是空?

+3

給它一個默認值。 –

+0

不能讓它變成不爲空? –

回答

5

如果您沒有提及insert中的列,那麼它將獲得默認值。默認情況下,默認值爲NULL。您可以指定別的東西:

create table time (
    a varchar2(9), 
    b varchar2(9) not null default 'NO VALUE', 
    c varchar2(9)) 
); 

編輯:

爲了讓您的alter table工作,先更新值:

update time 
    set b = 'NO VALUE' 
    where b is null; 
0

這是不可能的。 首先,您需要更新列b中的數據,然後應用非空約束。

Update time set b= 'NA' where b is null 
go 
ALTER TABLE time 
ALTER COLUMN b varchar(9) NOT NULL 
go 
+0

這是完全可能的,雖然我不會推薦任何人實際做到這一點! – Boneist

0

這是不可能完成的影響現有行創建一個約束:

create table test1(
a varchar2(9), 
b varchar2(9), 
c varchar2(9)); 

insert into test1 (a,c) values ('qq','ee'); 

commit; 

alter table test1 modify b varchar2(9) not null novalidate; 

select * from test1; 

A   B   C   
--------- --------- --------- 
qq     ee  


insert into test1 (a,c) values ('qq2','ee2'); 

ORA-01400: cannot insert NULL into ("SCHEMA1"."TEST1"."B") 

不過,我想建議使用此,因爲如果你需要在表上創建未來的限制,它會使事情大量複雜化,因爲表中有「無效」數據。

更好的方法是在創建約束條件時採取命中和「修復」數據,而不是聳聳肩並將其留下一段時間 - 它會回來咬你(或如果不是你,還有一些可憐的靈魂,他們將來會堅持維護數據庫!)。