如何在sql中删除检查约束

时间:2016-10-28 16:42:26

标签: sql oracle

我需要知道的是如何在我的桌子上放弃检查和主键约束。

这是我的表架构。

create table time_slot
  (time_slot_id    varchar(4),
   day      varchar(1),
   start_hr    numeric(2) check  (start_hr >= 0 and start_hr < 24),
   start_min    numeric(2) check (start_min >= 0 and start_min < 60),
   end_hr      numeric(2) check (end_hr >= 0 and end_hr < 24),
   end_min    numeric(2) check (end_min >= 0 and end_min < 60),
   primary key (time_slot_id, day, start_hr, start_min)
  );

2 个答案:

答案 0 :(得分:2)

您显示的命令适用于Oracle:

create table time_slot
  (time_slot_id    varchar(4),
   day      varchar(1),
   start_hr    numeric(2) check  (start_hr >= 0 and start_hr < 24),
   start_min    numeric(2) check (start_min >= 0 and start_min < 60),
   end_hr      numeric(2) check (end_hr >= 0 and end_hr < 24),
   end_min    numeric(2) check (end_min >= 0 and end_min < 60),
   primary key (time_slot_id, day, start_hr, start_min)
  );

Table TIME_SLOT created.

select constraint_name, constraint_type, search_condition
from user_constraints where table_name = 'TIME_SLOT';

CONSTRAINT_NAME                C SEARCH_CONDITION                                                                
------------------------------ - --------------------------------------------------------------------------------
SYS_C00117031                  C start_hr >= 0 and start_hr < 24                                                 
SYS_C00117032                  C start_min >= 0 and start_min < 60                                               
SYS_C00117033                  C end_hr >= 0 and end_hr < 24                                                     
SYS_C00117034                  C end_min >= 0 and end_min < 60                                                   
SYS_C00117035                  P                                                                                 

alter table time_slot drop constraint SYS_C00117031;

Table TIME_SLOT altered.

alter table time_slot drop primary key;

Table TIME_SLOT altered.

所以要么你使用旧的约束名称(并且已经删除并重新创建了表);或者有不同的表格实例(在不同的模式中),你在dba_constraints中看到了错误的实例;或者你试图在没有前缀的情况下修改另一个模式中的表。或者,可能是我没有想过的东西,可以通过分享你得到的错误来揭示......(例如没有权限放弃约束,正如@mathguy指出的那样 - 这可能是一件好事)< / p>

在稍后的评论中,您说您正在获得约束违规,这似乎与您之前提到的插入有关,而不是尝试放弃约束:

ORA-02290:check constraint(SYS.SYS._C0010701) violated

首先,除非您编辑它以隐藏您的真实模式名称(您可能拥有 - 至少还有一段额外的时间),这表明您正在创建和修改SYS模式中的内容。如果您正在停止操作,请为您自己创建一个新的用户/架构,并且只能在其中工作。你不应该在内置模式中搞乱。

其次,如果是来自插入,那是因为你试图将start_hr设置为30,这正是要防止的约束。你不是通过不提供列表来帮助自己;如果你这样做,那就更明显了:

insert into time_slot (time_slot_id, day, start_hr, start_min, end_hr, end_min)
values ('M', 'S', 30, 0, 15, 35);

所以你试图让开始时间为30:00,结束时间为15:35,这是没有意义的。

删除约束不是这里的答案,您需要提供有效数据。但如果您确实想要,则会在错误消息中提供相关的约束名称 - 您可以从dba / user_constraints中查看它是哪一个,如果您想删除它,则可以执行以下操作:

alter table time_slot drop constraint SYS_C0010701;

但我认为这是解决你真正问题的错误方法。

您可能还想考虑使用间隔或日期(带有固定的虚拟日期部分)而不是单独的小时和日期列;验证将自动进行。

答案 1 :(得分:-2)

ALTER TABLE time_slot DROP PRIMARY KEY;
ALTER TABLE time_slot DROP CHECK CHECK_NAME;