oracle中如何在有check和default约束的字段后加not null约束???

迟到_啦 太原理工大学 项目开发工程师  2017-11-11 05:16:30
先建表,再修改约束,语句如下:
create table title_copy(  
id number(3) not null,
t_id number(3) not null,
status char(9) default '未借出' constraint title_copy_status check(status in('已借出','未借出') ) ,
constraint title_copy_primary primary key(id),
constraint title_copy_foreign foreign key(t_id) references title(id)
);


按照网上方法添加约束如下(始终错误):
1.
 alter table title_copy modify status constraint title_copy_status check(status in('已借出','未借出')) not null ;

2.
 alter table title_copy modify status constraint title_copy_status not null ;



现在应该怎么添加约束? 如果建表时就加入not null,那么not null应该加在default后面,还是check约束后面,有影响么?
...全文
865 37 点赞 打赏 收藏 举报
写回复
37 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
minsic78 2017-11-13
另外: 其实not null约束可以说是check类型的一种特殊情况。 很多约束添加的时候不需要指定约束名(只要语法上允许,你就可以这么干),系统会为你生成自动生成一个约束名,这是之所以让你在删除前,去查数据字典获取约束名的一个重要原因,因为这种情况下,你不查就不可能知道想要删除的约束名叫啥。
  • 打赏
  • 举报
回复
minsic78 2017-11-13
引用 28 楼 qq_19314763 的回复:
[quote=引用 26 楼 minsic78 的回复:] [quote=引用 24 楼 qq_19314763 的回复:] [quote=引用 20 楼 minsic78 的回复:] [quote=引用 18 楼 qq_19314763 的回复:] [quote=引用 16 楼 minsic78 的回复:] [quote=引用 15 楼 minsic78 的回复:] [quote=引用 14 楼 qq_19314763 的回复:] [quote=引用 13 楼 qq646748739 的回复:] [quote=引用 12 楼 碧水幽幽泉的回复:]解决方法有2种:

--方法1:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  default '未借出'  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id),
   constraint title_copy_status check(status in('已借出','未借出') ) 
);

--方法2:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id)
);

alter table title_copy modify status default '未借出'  constraint title_copy_status  check(status in ('已借出','未借出'));
经过测试,上面两种解决方法都可以。[/quote] 好,这么说的话 按照你的第二种方法,那么要外加约束的话default必须和check一起写才行了? 先只写default再添加check和not null 不可以对吧, 而且我现在不清楚 删除约束是不是只能删除contraint约束,not null 怎么删呢?[/quote] 后续加肯定是可以的,你的语法有问题,主题贴也没贴到底报了什么错[/quote] 补充:删除的话,可以先从user_constraints视图查出对应的约束名,就可以删了[/quote] not null 和default不在约束名后面,通过约束名删不掉把,[/quote] 看不懂这个问题是啥意思?[/quote] 就是 如果我建表的时候呢,先写的default,not null,后面再写约束名+ 约束,这样的话删约束的时候通过约束名 也可以删掉not null 和default? [/quote] 还是看不懂 不过我觉得你查了那个数据字典视图之后,自己可以找到答案[/quote] ,,数据字典视图我们还没开始了解,不过我刚又看了一下约束类型,我发现 默认类型和not null 都属于一个单独的约束类型,也就是说 其实建表的时候可以每一个约束都给起个名字,这道题中,如果想通过约束名 删除not null, default约束,是不是建表的时候必须给他们取约束名 才行呢 ? 我刚说的not null 、default在 约束名后面意思就是 我把dafault 和not null 都写在了check约束名中后,这样我建表的时候会报错,是不是这样写 机器就认不得到底约束名指的是哪个约束了,一个约束名 只能负责一个约束 对吧[/quote] 因为default就是default,不是约束啊~
  • 打赏
  • 举报
回复
迟到_啦 2017-11-13
引用 26 楼 minsic78 的回复:
[quote=引用 24 楼 qq_19314763 的回复:] [quote=引用 20 楼 minsic78 的回复:] [quote=引用 18 楼 qq_19314763 的回复:] [quote=引用 16 楼 minsic78 的回复:] [quote=引用 15 楼 minsic78 的回复:] [quote=引用 14 楼 qq_19314763 的回复:] [quote=引用 13 楼 qq646748739 的回复:] [quote=引用 12 楼 碧水幽幽泉的回复:]解决方法有2种:

--方法1:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  default '未借出'  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id),
   constraint title_copy_status check(status in('已借出','未借出') ) 
);

--方法2:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id)
);

alter table title_copy modify status default '未借出'  constraint title_copy_status  check(status in ('已借出','未借出'));
经过测试,上面两种解决方法都可以。[/quote] 好,这么说的话 按照你的第二种方法,那么要外加约束的话default必须和check一起写才行了? 先只写default再添加check和not null 不可以对吧, 而且我现在不清楚 删除约束是不是只能删除contraint约束,not null 怎么删呢?[/quote] 后续加肯定是可以的,你的语法有问题,主题贴也没贴到底报了什么错[/quote] 补充:删除的话,可以先从user_constraints视图查出对应的约束名,就可以删了[/quote] not null 和default不在约束名后面,通过约束名删不掉把,[/quote] 看不懂这个问题是啥意思?[/quote] 就是 如果我建表的时候呢,先写的default,not null,后面再写约束名+ 约束,这样的话删约束的时候通过约束名 也可以删掉not null 和default? [/quote] 还是看不懂 不过我觉得你查了那个数据字典视图之后,自己可以找到答案[/quote] ,,数据字典视图我们还没开始了解,不过我刚又看了一下约束类型,我发现 默认类型和not null 都属于一个单独的约束类型,也就是说 其实建表的时候可以每一个约束都给起个名字,这道题中,如果想通过约束名 删除not null, default约束,是不是建表的时候必须给他们取约束名 才行呢 ? 我刚说的not null 、default在 约束名后面意思就是 我把dafault 和not null 都写在了check约束名中后,这样我建表的时候会报错,是不是这样写 机器就认不得到底约束名指的是哪个约束了,一个约束名 只能负责一个约束 对吧
  • 打赏
  • 举报
回复
minsic78 2017-11-13
另外,如果对语法什么的不太清楚,又非想用命令行来处理的,可以查oracle对应版本的在线文档Database SQL Language Reference,低版本的可能叫SQL Language Reference。 如果嫌麻烦,那就利用好手头的图形工具,plsql developer等等……
  • 打赏
  • 举报
回复
minsic78 2017-11-13
引用 24 楼 qq_19314763 的回复:
[quote=引用 20 楼 minsic78 的回复:] [quote=引用 18 楼 qq_19314763 的回复:] [quote=引用 16 楼 minsic78 的回复:] [quote=引用 15 楼 minsic78 的回复:] [quote=引用 14 楼 qq_19314763 的回复:] [quote=引用 13 楼 qq646748739 的回复:] [quote=引用 12 楼 碧水幽幽泉的回复:]解决方法有2种:

--方法1:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  default '未借出'  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id),
   constraint title_copy_status check(status in('已借出','未借出') ) 
);

--方法2:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id)
);

alter table title_copy modify status default '未借出'  constraint title_copy_status  check(status in ('已借出','未借出'));
经过测试,上面两种解决方法都可以。[/quote] 好,这么说的话 按照你的第二种方法,那么要外加约束的话default必须和check一起写才行了? 先只写default再添加check和not null 不可以对吧, 而且我现在不清楚 删除约束是不是只能删除contraint约束,not null 怎么删呢?[/quote] 后续加肯定是可以的,你的语法有问题,主题贴也没贴到底报了什么错[/quote] 补充:删除的话,可以先从user_constraints视图查出对应的约束名,就可以删了[/quote] not null 和default不在约束名后面,通过约束名删不掉把,[/quote] 看不懂这个问题是啥意思?[/quote] 就是 如果我建表的时候呢,先写的default,not null,后面再写约束名+ 约束,这样的话删约束的时候通过约束名 也可以删掉not null 和default? [/quote] 还是看不懂 不过我觉得你查了那个数据字典视图之后,自己可以找到答案
  • 打赏
  • 举报
回复
minsic78 2017-11-13
引用 21 楼 minsic78 的回复:
你想加个not null约束,很简单:
手快了…… 加not null约束: alter table title_copy modify status not null; 如果不行,具体报错信息是什么?不是语法错误就是比较少见的问题了,没报错信息那是瞎猫抓耗子,连毛可能都碰不到一根。 删除约束:select * from user_constraints where table_name='TITLE_COPY'; 具体要找什么样的约束,查了这个视图你就应该知道了,接下来就是删除: alter table title_copy drop constraint 约束名;
  • 打赏
  • 举报
回复
迟到_啦 2017-11-13
引用 20 楼 minsic78 的回复:
[quote=引用 18 楼 qq_19314763 的回复:] [quote=引用 16 楼 minsic78 的回复:] [quote=引用 15 楼 minsic78 的回复:] [quote=引用 14 楼 qq_19314763 的回复:] [quote=引用 13 楼 qq646748739 的回复:] [quote=引用 12 楼 碧水幽幽泉的回复:]解决方法有2种:

--方法1:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  default '未借出'  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id),
   constraint title_copy_status check(status in('已借出','未借出') ) 
);

--方法2:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id)
);

alter table title_copy modify status default '未借出'  constraint title_copy_status  check(status in ('已借出','未借出'));
经过测试,上面两种解决方法都可以。[/quote] 好,这么说的话 按照你的第二种方法,那么要外加约束的话default必须和check一起写才行了? 先只写default再添加check和not null 不可以对吧, 而且我现在不清楚 删除约束是不是只能删除contraint约束,not null 怎么删呢?[/quote] 后续加肯定是可以的,你的语法有问题,主题贴也没贴到底报了什么错[/quote] 补充:删除的话,可以先从user_constraints视图查出对应的约束名,就可以删了[/quote] not null 和default不在约束名后面,通过约束名删不掉把,[/quote] 看不懂这个问题是啥意思?[/quote] 就是 如果我建表的时候呢,先写的default,not null,后面再写约束名+ 约束,这样的话删约束的时候通过约束名 也可以删掉not null 和default?
  • 打赏
  • 举报
回复
迟到_啦 2017-11-13
引用 21 楼 minsic78 的回复:
你想加个not null约束,很简单:
我也觉得很简单,前天我怎么写都不对, 刚才终于 可以I改了
  • 打赏
  • 举报
回复
迟到_啦 2017-11-13
引用 17 楼 qq_19314763 的回复:
[quote=引用 11 楼 minsic78 的回复:]
[quote=引用 10 楼 qq_19314763 的回复:]

你看, 一下


因为你主动写了空值,不写再试试[/quote]

不写确实可以给默认值,现在关键不是默认值失效,而是它不能为空,但目前这种情况是会出现空的,理想状态是怎么写都不能出现空值[/quote]

现在好了,莫名其妙的,前天一直错误, 非常感谢您的帮助
  • 打赏
  • 举报
回复
minsic78 2017-11-13
你想加个not null约束,很简单:
  • 打赏
  • 举报
回复
minsic78 2017-11-13
引用 18 楼 qq_19314763 的回复:
[quote=引用 16 楼 minsic78 的回复:] [quote=引用 15 楼 minsic78 的回复:] [quote=引用 14 楼 qq_19314763 的回复:] [quote=引用 13 楼 qq646748739 的回复:] [quote=引用 12 楼 碧水幽幽泉的回复:]解决方法有2种:

--方法1:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  default '未借出'  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id),
   constraint title_copy_status check(status in('已借出','未借出') ) 
);

--方法2:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id)
);

alter table title_copy modify status default '未借出'  constraint title_copy_status  check(status in ('已借出','未借出'));
经过测试,上面两种解决方法都可以。[/quote] 好,这么说的话 按照你的第二种方法,那么要外加约束的话default必须和check一起写才行了? 先只写default再添加check和not null 不可以对吧, 而且我现在不清楚 删除约束是不是只能删除contraint约束,not null 怎么删呢?[/quote] 后续加肯定是可以的,你的语法有问题,主题贴也没贴到底报了什么错[/quote] 补充:删除的话,可以先从user_constraints视图查出对应的约束名,就可以删了[/quote] not null 和default不在约束名后面,通过约束名删不掉把,[/quote] 看不懂这个问题是啥意思?
  • 打赏
  • 举报
回复
minsic78 2017-11-13
引用 17 楼 qq_19314763 的回复:
[quote=引用 11 楼 minsic78 的回复:] [quote=引用 10 楼 qq_19314763 的回复:] 你看, 一下
因为你主动写了空值,不写再试试[/quote] 不写确实可以给默认值,现在关键不是默认值失效,而是它不能为空,但目前这种情况是会出现空的,理想状态是怎么写都不能出现空值[/quote] alter table title_copy modify status not null;
  • 打赏
  • 举报
回复
迟到_啦 2017-11-13
引用 16 楼 minsic78 的回复:
[quote=引用 15 楼 minsic78 的回复:] [quote=引用 14 楼 qq_19314763 的回复:] [quote=引用 13 楼 qq646748739 的回复:] [quote=引用 12 楼 碧水幽幽泉的回复:]解决方法有2种:

--方法1:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  default '未借出'  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id),
   constraint title_copy_status check(status in('已借出','未借出') ) 
);

--方法2:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id)
);

alter table title_copy modify status default '未借出'  constraint title_copy_status  check(status in ('已借出','未借出'));
经过测试,上面两种解决方法都可以。[/quote] 好,这么说的话 按照你的第二种方法,那么要外加约束的话default必须和check一起写才行了? 先只写default再添加check和not null 不可以对吧, 而且我现在不清楚 删除约束是不是只能删除contraint约束,not null 怎么删呢?[/quote] 后续加肯定是可以的,你的语法有问题,主题贴也没贴到底报了什么错[/quote] 补充:删除的话,可以先从user_constraints视图查出对应的约束名,就可以删了[/quote] not null 和default不在约束名后面,通过约束名删不掉把,
  • 打赏
  • 举报
回复
迟到_啦 2017-11-13
引用 11 楼 minsic78 的回复:
[quote=引用 10 楼 qq_19314763 的回复:] 你看, 一下
因为你主动写了空值,不写再试试[/quote] 不写确实可以给默认值,现在关键不是默认值失效,而是它不能为空,但目前这种情况是会出现空的,理想状态是怎么写都不能出现空值
  • 打赏
  • 举报
回复
minsic78 2017-11-13
引用 15 楼 minsic78 的回复:
[quote=引用 14 楼 qq_19314763 的回复:] [quote=引用 13 楼 qq646748739 的回复:] [quote=引用 12 楼 碧水幽幽泉的回复:]解决方法有2种:

--方法1:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  default '未借出'  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id),
   constraint title_copy_status check(status in('已借出','未借出') ) 
);

--方法2:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id)
);

alter table title_copy modify status default '未借出'  constraint title_copy_status  check(status in ('已借出','未借出'));
经过测试,上面两种解决方法都可以。[/quote] 好,这么说的话 按照你的第二种方法,那么要外加约束的话default必须和check一起写才行了? 先只写default再添加check和not null 不可以对吧, 而且我现在不清楚 删除约束是不是只能删除contraint约束,not null 怎么删呢?[/quote] 后续加肯定是可以的,你的语法有问题,主题贴也没贴到底报了什么错[/quote] 补充:删除的话,可以先从user_constraints视图查出对应的约束名,就可以删了
  • 打赏
  • 举报
回复
minsic78 2017-11-13
引用 14 楼 qq_19314763 的回复:
[quote=引用 13 楼 qq646748739 的回复:] [quote=引用 12 楼 碧水幽幽泉的回复:]解决方法有2种:

--方法1:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  default '未借出'  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id),
   constraint title_copy_status check(status in('已借出','未借出') ) 
);

--方法2:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id)
);

alter table title_copy modify status default '未借出'  constraint title_copy_status  check(status in ('已借出','未借出'));
经过测试,上面两种解决方法都可以。[/quote] 好,这么说的话 按照你的第二种方法,那么要外加约束的话default必须和check一起写才行了? 先只写default再添加check和not null 不可以对吧, 而且我现在不清楚 删除约束是不是只能删除contraint约束,not null 怎么删呢?[/quote] 后续加肯定是可以的,你的语法有问题,主题贴也没贴到底报了什么错
  • 打赏
  • 举报
回复
迟到_啦 2017-11-13
引用 13 楼 qq646748739 的回复:
[quote=引用 12 楼 碧水幽幽泉的回复:]解决方法有2种:

--方法1:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  default '未借出'  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id),
   constraint title_copy_status check(status in('已借出','未借出') ) 
);

--方法2:
create table title_copy(  
   id number(3) not null,
   t_id number(3) not null,
   status char(9)  not null,
   constraint title_copy_primary primary key(id), 
   constraint title_copy_foreign foreign key(t_id) references title(id)
);

alter table title_copy modify status default '未借出'  constraint title_copy_status  check(status in ('已借出','未借出'));
经过测试,上面两种解决方法都可以。[/quote] 好,这么说的话 按照你的第二种方法,那么要外加约束的话default必须和check一起写才行了? 先只写default再添加check和not null 不可以对吧, 而且我现在不清楚 删除约束是不是只能删除contraint约束,not null 怎么删呢?
  • 打赏
  • 举报
回复
碧水幽幽泉 2017-11-13
引用 12 楼 碧水幽幽泉的回复:
解决方法有2种:

--方法1:
create table title_copy(
id number(3) not null,
t_id number(3) not null,
status char(9) default '未借出' not null,
constraint title_copy_primary primary key(id),
constraint title_copy_foreign foreign key(t_id) references title(id),
constraint title_copy_status check(status in('已借出','未借出') )
);

--方法2:
create table title_copy(
id number(3) not null,
t_id number(3) not null,
status char(9) not null,
constraint title_copy_primary primary key(id),
constraint title_copy_foreign foreign key(t_id) references title(id)
);

alter table title_copy modify status default '未借出' constraint title_copy_status check(status in ('已借出','未借出'));
经过测试,上面两种解决方法都可以。
  • 打赏
  • 举报
回复
碧水幽幽泉 2017-11-13
解决方法有2种:

--方法1:
create table title_copy(
id number(3) not null,
t_id number(3) not null,
status char(9) default '未借出' not null,
constraint title_copy_primary primary key(id),
constraint title_copy_foreign foreign key(t_id) references title(id),
constraint title_copy_status check(status in('已借出','未借出') )
);

--方法2:
create table title_copy(
id number(3) not null,
t_id number(3) not null,
status char(9) not null,
constraint title_copy_primary primary key(id),
constraint title_copy_foreign foreign key(t_id) references title(id)
);

alter table title_copy modify status default '未借出' constraint title_copy_status check(status in ('已借出','未借出'));
  • 打赏
  • 举报
回复
minsic78 2017-11-13
引用 10 楼 qq_19314763 的回复:
你看, 一下
因为你主动写了空值,不写再试试
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
基础和管理
加入

1.7w+

社区成员

Oracle 基础和管理
申请成为版主
帖子事件
创建了帖子
2017-11-11 05:16
社区公告
暂无公告