关于oracle中的not null约束

写在开始处:这是第一篇博客,今天是实习的第一个月的倒数第二天(11月3号开始实习的呢)

今天在给oracle中建表时,遇到了一个问题

例如:

CREATE TABLE test(
        a VARCHAR2(2) NOT NULL DEFAULT '0',
        b VARCHAR2(2)
);
报错: ORA-00907:缺失右括号


嗯,先把表建了再说,把上段代码改为:

CREATE TABLE test(
        a VARCHAR2(2),
        b VARCHAR2(2)
);
这次成功了


但是 not null约束 和 默认值 不能不要了啊,

于是再次尝试:

ALTER TABLE test MODIFY b VARCHAR2(2) NOT NULL DEFAULT '0';

 
还是不对,换了个错误: ORA-30649:缺少DIRECTORY关键字 

但是利用pl/sql的可视化的Edit table功能尝试,确实是可以为列同时添加 默认值 和 not null 约束,那么之前失败的原因是什么呢?

经过多次尝试,发现:

ALTER TABLE test MODIFY b VARCHAR2(2) DEFAULT '0' NOT NULL;
可以正确执行。


类似的,对调default 和 not null 的位置,重试建表:

DROP TABLE test;
CREATE TABLE test(
        a VARCHAR2(2) DEFAULT '0' NOT NULL,
        b VARCHAR2(2)
);

 
ok,一切顺利,撒花。 

也就是说,在oracle中 default... 要写在 not null 的前面,先写字段的默认值,再为字段添加 not null 约束

茉茉的尝试并没有到此停止,向表中插入数据,

INSERT INTO test VALUES('1','2');
INSERT INTO test(a) VALUES('2');

此时,再为表中添加字段时,可以设为 not null 么?

ALTER TABLE test ADD c VARCHAR2(2) NOT NULL;

报错:ORA-01758:要添加必需的(NOT NULL)列,则表必需为空

不要忘了,我是在和 default 死磕,嗯,所以,试试:

ALTER TABLE test ADD c VARCHAR2(2) DEFAULT '0' NOT NULL;
啊啊啊,成功了!!!

查看表中所有数据,发现,当前已经存在的记录,在c这一列的值均为“0”


不过呢,看一眼上面向表中插数据的语句,看到了么,有一条记录的 b 列为 null ,那我们可以用与添加字段类似的方法,通过设默认值将b转为not null的么?

ALTER TABLE test MODIFY b VARCHAR2(2) DEFAULT '0' NOT NULL;

报错了呢:ORA-02296::无法启用(XXXX)-找到空值


这次不行了呢。不过我们可以通过update来为b列加一个值:

UPDATE test SET b=' ' WHERE b IS NULL;

现在就可以为字段b添加非空约束了。


对了,再补充一点oracle把 '' 认作 null ,一定要注意哦。


好了今天到此结束了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值