Oracle修改check约束的sql语句

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36411874/article/details/87971883

开始想修改这张表的其中一个字段的约束 check约束,百度各种说不能修改check约束??只能删掉了约束,再重新修改约束。经过各种测试得出,oracle是可以修改check约束,但是也是必须需要删掉原来的约束(我天真的以为,修改会自动删掉,是不会的!),才能插入数据成功!!!!上代码。

(1)首先使用desc 表名字查看表结构。

desc 表名字;

也就是修改该表名字中的stat_cde,原本类型是 not null varcher2(1) ,累似于性别的标记。需要填写指定的字符。

(2)再看表约束,sql如下:

--查询约束关系
select * from user_constraints where table_name='ES_SUNING_AUTO_TASK';

查询结果如下,查询出来 stat_cde 是SPAE字符。现在需要修改成SPAEI。

(3)正确的修改 check的语句:(stat_cde是字段名字)

--更改约束关系
alter table 表名字 modify STAT_CDE VARCHAR2(1)  check(STAT_CDE in('S', 'P', 'A', 'E','I'));

修改执行结果:

(4)再次查询结果,是多了一条约束记录,之前的约束是还在的。

当你再次选择插入的时候,还是会报错。因为原来既有SPAE约束,也有你新加入的SPAEI 判断约束,两条都执行。因此会报错。

执行插入语句,会报错:

insert into 表名字 (ID,ORDER_CODE,ORDER_KEY,STAT_CDE,MSG,creat_dte) values (SQ_ES_SUNING_AUTO_TASK_ID.nextval,'123',null,'I',null,sysdate);

报错结果

在行: 514 上开始执行命令时出错 -
insert into 你的表名字 (ID,ORDER_CODE,ORDER_KEY,STAT_CDE,MSG,creat_dte) values (SQ_ES_SUNING_AUTO_TASK_ID.nextval,'123',null,'I',null,sysdate)
错误报告 -
ORA-02290: check constraint (SYS_ES.SYS_C00114563) violated

(5)因此,是还需要删除你原来的约束的!并且先查找除你的contanatnt_name,后删除提交。

你的contraint name,不需要加单引号,直接复制。

--先查询一次你的contraint name
select * from user_constraints where table_name='大写表名字';

--删除约束 , SYS_C00114563 是你的contraint name,并且,不需要加单引号,直接复制
alter table 表名字   drop constraint SYS_C00114563;

(6)删除约束成功后,重新插入,即可插入成功。修改check约束完毕

最后成功解决

猜你喜欢

转载自blog.csdn.net/qq_36411874/article/details/87971883