写在开始处:这是第一篇博客,今天是实习的第一个月的倒数第二天(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 ,一定要注意哦。
好了今天到此结束了。